我有一個PreferenceFragment
有一個SwitchPreference
。 Switch目前已打開,我想在onResume()
中將其關閉(false)。然而,我注意到一個奇怪的結果:編寫偏好是假的後,我得到不同的結果使用findPreference(KEY)).isChecked())
時使用sharedPreferences.getBoolean(KEY, defaultValue))
sharedPreferences.getBoolean()和findPreference(KEY).isChecked()之間的區別是什麼
public class SettingsFragment extends PreferenceFragment {
private static final String KEY = "pref_enable";
....
@Override
public void onResume() {
super.onResume();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
//Log the current value of SwitchPreferences, should be true
Log.d(TAG, "before by findPref: " + ((SwitchPreference) findPreference(KEY)).isChecked());
Log.d(TAG, "before by sharedPref: " + sharedPreferences.getBoolean(KEY, true));
sharedPreferences.edit().putBoolean(KEY, false).apply();
//Log the value of SwitchPreferences after writing false, should be false
//this still prints true (WRONG)
Log.d(TAG, "after by findPref: " + ((SwitchPreference) findPreference(KEY)).isChecked());
//this prints false (as expected)
Log.d(TAG, "after by sharedPref: " + sharedPreferences.getBoolean(KEY, true));
}
....
}
,輸出是:
before by findPref: true
before by sharedPref: true
after by findPref: true
after by sharedPref: false
然後我打開我的XML /data/data/packagename/shared_prefs
文件夾中的設置進行檢查,結果現在是錯誤的(如預期的那樣)。從那以後,我按回到終止該應用,然後再次打開它,然後日誌現在預期(全是假的,因爲我們之前設定的開關爲false)
before by findPref: false
before by sharedPref: false
after by findPref: false
after by sharedPref: false
這意味着此聲明((SwitchPreference) findPreference(KEY)).isChecked()
右後向Switch寫入錯誤會產生錯誤的結果。這是爲什麼?
但假設我想讓首選項爲false並且以編程方式取消選中。我的理解是,我無法通過'sharedPreferences.edit()。putBoolean(KEY,false).apply();'來更新xml,並且希望取消選中視圖,但是應該使用'( SwitchPreference)findPreference(KEY))。setChecked(false);'然後我的xml文件會立即更新。是對的嗎? – 2014-10-31 05:59:15
首選項直接連接到xml中的keyId。所以無論什麼時候發生變化,這個變化都會反映在xml中。事情是,你不應該通過手動覆蓋這個值而感到困惑。 – waqaslam 2014-10-31 13:42:23
但我想要的是使首選項被取消選中,並以編程方式(不通過觸摸屏幕)錯誤。我已經通過'setChecked(false)'成功完成了,而這正是我想要的。我理解你的答案的前半部分,但是從「另外,原因...」開始的部分並不回答我的問題,因爲將它設置爲編程錯誤是我想要的,這並不是因爲我感到困惑。所以我認爲你應該刪除那部分,我會將你的答案標記爲我的答案。 – 2014-11-01 11:30:08