我正在尝试熟悉使用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时,我搞砸了什么?
答案 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(...)'方法可以完成这项工作,但没有布尔返回值但是无效?我无法找到任何例子,请你展示或指向考试?