web-dev-qa-db-ja.com

変更Androidスイッチの状態

私は現在、メニューのあるアプリを開発しています。メニューのオプションの1つは「設定」で、ユーザーは基本的にサウンドなどをオフにするかどうかを決定できます。現在、設定アクティビティに2つのスイッチがあります。以下は、これまでの設定アクティビティのJavaコードです。

import Android.support.v7.app.ActionBarActivity;


public class Options extends ActionBarActivity {
private  Switch Ding;
private Switch countdown;
public  boolean isDingChecked;
public  boolean isCountdownChecked;
public static final String PREFS = "examplePrefs";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_options);
Ding = (Switch) findViewById(R.id.switch1);
Ding.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        SharedPreferences examplePrefs = getSharedPreferences(PREFS,0);
        Editor editor = examplePrefs.edit();
        editor.putBoolean("userMessage", isChecked);
        editor.commit();

        //System.out.println(examplePrefs.getBoolean("userMessage", isChecked));
        isDingChecked = examplePrefs.getBoolean("userMessage", isChecked);
        System.out.println(isDingChecked + " is Ding checked");
        Ding.setChecked(isDingChecked);
    }
});

countdown = (Switch) findViewById(R.id.switch2);
countdown.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // do something, the isChecked will be
        // true if the switch is in the On position
        isCountdownChecked = isChecked;

    }
});     
 }
 }

他のアクティビティでブール値を使用できるので、SharedPreferenceは正常に機能します。ただし、メニューアクティビティに戻り、このオプションアクティビティに戻ると、ユーザーの状態に関係なく、スイッチの状態はデフォルト値のtrueに戻ります。とにかくこれを修正できますか?

Ding.setChecked(isDingChecked)

本当に何もしていないと思います。私は過去にこれに似た質問を投稿したことを知っています。それは、あまり活動がなかったというだけで、かなり長い間この問題に取り組んできました。ありがとう!

8
user2677095

このようなものを試してください:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_options);
    Ding = (Switch) findViewById(R.id.switch1);

    //grab prefs first
    final SharedPreferences examplePrefs = getSharedPreferences(PREFS,0);
    final Editor editor = examplePrefs.edit();
    Ding.setChecked(examplePrefs.getBoolean("your_key", false)); //false default 


    Ding.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            //commit prefs on change
            editor.putBoolean("your_key", isChecked);
            editor.commit();

            System.out.println(isDingChecked + " is Ding checked");
        }
    });
21
Will Thomson

スイッチのsetChecked(value)メソッドは完全に正常に動作しますが、不要なonCheckedChanged(...)メソッド内で呼び出します。
そのため、Switchを最新の値に設定するには、プリファレンスをロードし、setOnCheckedChangeListenerリスナーの外部でチェック状態を設定する必要があります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_options);
    // your current code

    //load and set preferences
    SharedPreferences examplePrefs = getSharedPreferences(PREFS,0);
    isDingChecked = examplePrefs.getBoolean("userMessage", isChecked);
    Ding.setChecked(isDingChecked);
}
0
reVerse