我有一个PreferenceFragment
SwitchPreference
。 Switch当前已打开,我想在onResume()
中将其关闭(false)。但是,我注意到一个奇怪的结果:在将首选项写为false后,使用findPreference(KEY)).isChecked())
并使用sharedPreferences.getBoolean(KEY, defaultValue))
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
然后我在/data/data/packagename/shared_prefs
文件夹中打开我的xml设置进行检查,结果现在为false(正如预期的那样)。之后我通过按Back然后再次打开它来杀死应用程序,然后日志现在正如预期的那样(全部为假,因为我们之前已将开关设置为false)
before by findPref: false
before by sharedPref: false
after by findPref: false
after by sharedPref: false
这意味着在向switch写入false之后,此语句((SwitchPreference) findPreference(KEY)).isChecked()
会产生错误的结果。那是为什么?
答案 0 :(得分:1)
((SwitchPreference) findPreference(KEY)).isChecked()
这表示是否选中了复选框首选项(显示在屏幕上)。它仅描述了可用于进一步编程的复选框状态。
sharedPreferences.getBoolean(KEY, true)
此返回存储在给定密钥的共享首选项中的内容(如果不可用,则返回默认值)。无论您的偏好视图如何,它都可以单独使用,并用于存储值。
但是,通常,您的首选项视图的 keyId 与用于在默认共享首选项中存储其值的相同,并且当您更改其状态时,该值会立即更新xml。
答案 1 :(得分:0)
如果您使用PreferenceFragment
,则无需自行保存价值
我认为,它会被框架自动处理。