【发布时间】:2011-09-23 22:06:51
【问题描述】:
编辑: 下面描述的问题是由于一个非常特殊的设备问题而不是由任何与编码相关的问题引起的。
我有一个preferenceActivity,其中有许多checkBoxPreferences。 checkBoxPreference 假设保存默认的共享首选项文件,然后在我打开应用程序时再次调用以更新 UI。
这并没有像想象的那样发生。 如果我关闭应用程序并重新打开它,我的值将保持原样,但如果我使用任务管理器结束应用程序或者如果我重启手机(当应用程序未运行时),则调用 defaultValues再次。
所以,我在 onResume() 中创建了一个 SharedPreference 来测试它。
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
然后我检查该共享首选项中是否有键。
pref.contains("myCheckBoxPreference");
当我关闭并重新打开它时,它返回 true。如果我用任务管理器关闭或关闭并重新打开手机,则返回 false。
所以,我尝试手动设置 SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
然后当 checkboxpreference 值改变时我调用了它。我还尝试在 onStop 和 onPause 中调用它。不过,如果我关闭应用程序并重新打开它,pref.contains 会返回 true,但如果我关闭并重新打开手机电源,它会返回 false。
然后我尝试使用 SharedPreferences 文件。
在类声明中:
public static final String PREFS = "prefs";
在 onResume() 中:
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
同样的行为,如果我只是关闭应用程序并重新打开它,pref.contains 仍然返回 true,但如果我关闭并重新打开手机,它会返回 false。
然后我尝试将 myCheckBoxPreference 的键值更改为与 CheckBoxPreference 的 xml 键不匹配的值,它仍然具有相同的效果。
我把手机里的应用卸载了,然后关机再开机,再重新安装,还是一样的效果。
【问题讨论】:
-
我很想在你测试这个时看到 logcat 的输出,一个完全用 onCreate 编写的精确测试用例,它只是打开首选项并保存一个值,然后在下次你读回来启动程序,你的 MYPREFS 常量的内容是什么。您真的无法读回首选项,还是在您启动 PreferenceActivity 子类时它们根本没有出现在 DialogPreference GUI 中?
-
好吧,我会发布,但我真的是 android 新手,老实说不知道如何使用 logcat,我只是发出 Toast 通知来告诉我事情是否正确。 (无论如何我觉得这更有用,因为我可以在应用程序运行时轻松查看 toast。但是,在 toast 通知中,当我之前将布尔值保存为 true 时,它表示布尔值为 false。当从主要活动和调用 sharedpreference 的另一个活动。而且 GUI 更新似乎不是问题,因为它在重启手机之前工作。
-
在 Android 2.3.7 上观察到相同的行为。虽然我注意到旋转设备就足够了,这样活动就被破坏了,
onCreate再次使用新的首选项触发。 -
@jakar 在加载设置后添加
Log.d("prefstest", "Pref == " + pref);之类的行,它会将数据放到 Eclipse 中的 logcat 输出中。它也可以通过在终端窗口上键入adb logcat来阅读。非常方便。
标签: android sharedpreferences preferenceactivity preference taskmanager