无法获取SharedPreferences

时间:2015-06-16 11:10:26

标签: java android sharedpreferences preferenceactivity

我正在尝试熟悉使用SharedPreferences,通过构建一个简单的测试应用程序,我通过使用扩展'PreferenceActivity'的类来存储和检索用户首选项。

问题是,每次我关闭应用程序并再次启动它时,我都无法加载我之前选择的SharedPreferences值。

在MainActivity的onCreate方法中,我首先调用方法'loadPreferences',然后创建一个ImageView和一个按钮。 我将onclick监听器分配给创建并启动新意图的按钮。

...onClick(View v){
    Intent intent = new Intent(MainActivity.this, MyPrefsActivity.class);
    startActivity(intent);
}

在MyPrefsActivity类中,我有一个具有'Preference.OnPreferenceChangeListener'的ListPreference。

... {
    @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            imageNumber = Integer.parseInt(newValue.toString());
            return true;
        }
    };

在'onResume'中从MyPrefsActivity返回到MainActivity:

protected void onResume() {
    super.onResume();
    savePreferences();
    loadPreferences();
}

private void savePreferences(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putInt("imageNumber", MyPrefsActivity.imageNumber);
    editor.apply();
}

private void loadPreferences (){
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        int imageNumb = prefs.getInt("imageNumber", 0);                                                       
        switch (imageNumb){
            case 0:
                imageView.setImageResource(R.mipmap.image1);
                break;
            case 1:
                imageView.setImageResource(R.mipmap.image2);
                break;
            case 2:
                imageView.setImageResource(R.mipmap.image3);
                break;
            default:
                imageView.setImageResource(R.mipmap.image4);
        }
}

当启动时第一次调用'loadPreferences'时,'imageNumb'allways的值为0,安装我在上一次运行的方法'savePreferences'时分配的值。

我注意到,在我第一次进入'MyPreferencesAction'并打开ListPreferences时启动后,我在上次运行中选中的复选框已经为我选中了。看起来我的选择已保存,但当我尝试加载SharedPreferences时,我搞砸了什么?

2 个答案:

答案 0 :(得分:1)

您必须在onPause事件中保存您的偏好设置。现在,当您想要的值不再存在时,您将其保存在onResume中。

@Override
protected void onPause(){
   super.onPause();
   savePreferences();
}

@Override
protected void onResume() {
    super.onResume();
    loadPreferences();
}

您的代码还有另一个问题。您要在MainActivity中保存偏好设置,但要在MyPrefsActivity中更改偏好设置。那样不行。您必须在MyPrefsActivity中保存对首选项的更改,并在其中使用上面的加载/保存模式。如果您在MainActivity中没有发生任何偏好更改,则可以安全地忽略从中调用savePreferences

根据MyPrefsActivity来自MyPrefsActivity.imageNumber的{​​{1}}来电声明可能不安全,您也必须更改该代码。就像我说的那样,MainActivity中很可能根本不需要它(如果你保存的只是MainActivity中设置的首选项值),那应该是MyPrefsActivity的一部分。

同样MyPrefsActivity可能是多余的,因为当用户更改了此Preference的值并且即将设置和/或持久化时,将调用其主要用法。这使客户有机会阻止设置和/或持久化值。

答案 1 :(得分:0)

我意识到我的代码中存在许多不必要的复杂性。所以我完全摆脱了savePreferences()方法。相反,我简化了PreferenceChangeListeners方法onPreferenceChange(...): 在我看来,这是使用PreferenceActivity时更新SharedPreferences的最简单方法。

public boolean onPreferenceChange(Preference preference, Object newValue) {                
            preference.getEditor().
            putInt("imageNumber", Integer.parseInt(newValue.toString())).apply();
            return true;
        }

现在我手动保存SharedPreferences,仅在调用'onPreferenceChange'时。不是'onResume','onStop','onRestart'或'onPause'。

如果这是改变SharedPreferences的不好方法,请通知我。

引用Dalija Prasnikar:“reference.OnPreferenceChangeListener可能是多余的,因为当用户更改了此Preference的值并且即将设置和/或持久化时,将调用其主要用法。这为客户端提供了一个有可能阻止设定和/或保持价值。“

如果你理解正确的Dalija,有一个'onPreferenceChange(...)'方法可以完成这项工作,但没有布尔返回值但是无效?我无法找到任何例子,请你展示或指向考试?