sharedPreferences.getBoolean()和findPreference(KEY)之间有什么区别.isChecked()

时间:2014-10-31 02:58:16

标签: android sharedpreferences

我有一个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()会产生错误的结果。那是为什么?

2 个答案:

答案 0 :(得分:1)

((SwitchPreference) findPreference(KEY)).isChecked()

这表示是否选中了复选框首选项(显示在屏幕上)。它仅描述了可用于进一步编程的复选框状态。


sharedPreferences.getBoolean(KEY, true)

返回存储在给定密钥的共享首选项中的内容(如果不可用,则返回默认值)。无论您的偏好视图如何,它都可以单独使用,并用于存储值。


但是,通常,您的首选项视图的 keyId 与用于在默认共享首选项中存储其值的相同,并且当您更改其状态时,该值会立即更新xml。

答案 1 :(得分:0)

apply is asynchronous

如果您使用PreferenceFragment,则无需自行保存价值 我认为,它会被框架自动处理。