我试图通过构建一个简单的测试应用程序来熟悉SharedPreferences的使用,该应用程序通过使用扩展了'PreferenceActivity'的类来存储和检索用户首选项。
问题在于,每次我关闭应用程序并重新启动时,都无法加载之前选择的SharedPreferences值。
在MainActivity的onCreate方法中,我首先调用方法“ loadPreferences”,然后创建一个ImageView和一个按钮。
我将onclick侦听器分配给了创建并启动新意图的按钮。
...onClick(View v){
Intent intent = new Intent(MainActivity.this, MyPrefsActivity.class);
startActivity(intent);
}
在MyPrefsActivity类中,我有一个ListPreference,它具有一个'Preference.OnPreferenceChangeListener'。
... {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
imageNumber = Integer.parseInt(newValue.toString());
return true;
}
};
从MyPrefsActivity返回到“ onResume”中的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”始终为0,这与我在方法“ savePreferences”中先前运行时分配的值保持一致。
我注意到启动后,当我第一次输入“ MyPreferencesAction”并打开ListPreferences时,我为我上次运行时选择的复选框已被选中。看来我的选择已保存,但是当我尝试加载SharedPreferences时,我搞砸了吗???
最佳答案
您必须在onPause
事件中保存您的首选项。现在,当所需的值不再存在时,您将其保存在onResume
中。
@Override
protected void onPause(){
super.onPause();
savePreferences();
}
@Override
protected void onResume() {
super.onResume();
loadPreferences();
}
您的代码还有另一个问题。您在
MainActivity
中保存了首选项,但是在MyPrefsActivity
中对其进行了更改。这是行不通的。您必须将对首选项的更改保存在MyPrefsActivity
中,在那里也要使用上面的加载/保存模式。如果MainActivity
中没有发生任何首选项更改,则可以安全地省略从中调用savePreferences
的操作。根据从
MyPrefsActivity
调用MyPrefsActivity.imageNumber
的MainActivity
声明可能并不安全,您也必须更改该代码。就像我说的那样,很可能在MainActivity
中根本不需要它(如果您仅保存在MyPrefsActivity
中设置的首选项值),则该值应该是MyPrefsActivity
的一部分。另外,
Preference.OnPreferenceChangeListener
可能是多余的,因为它的主要用法是在用户更改了此首选项的值并将要对其进行设置和/或持久化时调用它。这使客户有机会防止设置和/或保持该值。