我的设置活动会延长PreferenceActivity
,只要我留在应用中,所有内容都会按预期工作。但是一旦我重新启动应用程序(例如通过Android Studio),所有设置都将恢复为默认设置。
我也尝试设置isPersistent
标志,也没有帮助。
settings.xml中的条目示例:
<CheckBoxPreference
android:defaultValue="false"
android:key="askcode"
android:title="@string/askCodeSettingsString" />
我的子类中的 onCreate
方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
...
我在重新启动应用时尝试获取设置的方式:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean keepdata = pref.getBoolean("askcode", false);
我还读到有些人通过更改AndroidManifest.xml
中的条目来使其工作,但这看起来不错:
<activity
android:name=".SettingsActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light" >
</activity>
修改
我手动存储的其他偏好正在按预期工作:
保存:
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString(PREFS_MANUAL, "12345");
editor.commit();
取:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String myString = prefs.getString(PREFS_MANUAL, "");
return myString; // now 12345
编辑2 *
我似乎找到了问题 - 但不是导致问题的原因。我有所有偏好的默认值;对于字符串而言android:defaultValue=""
我认为这还不够,但我该如何防止这种情况呢?
09-18 12:13:23.763 925-940/com.... W/SharedPreferencesImpl﹕ getSharedPreferences
org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string
at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:568)
at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:821)
at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:755)
at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:494)
at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:113)
at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:48)
at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:87)
答案 0 :(得分:1)
PreferenceManager
调用apply(),将首选项异步保存到持久存储。
所以我的猜测是当你通过DDMS杀死应用程序时,尚未编写首选项。 当您尝试手动保存时,您调用了commit(),它会阻止UI线程,直到将首选项写入持久存储。
在您尝试手动保存的代码段中,如果您拨打apply()而不是commit()
,则会得到与使用PreferenceScreen
逻辑相同的结果。
当我第一次问你是否正在退出PreferencesActivity
时,我认为它可能会引发onStop()
或onDestroy()
事件等的写入,但事实证明它与此无关。
我不熟悉apply()
的内部逻辑很多,说明在写入首选项之前你应该等待多长时间,但这不应该花费很长时间。
没有什么可担心的。在最终用户设备上运行时,应用程序通常不会被杀死。
如果您担心不会立即保存偏好设置,唯一的方法是在您希望立即保存的每个OnPreferenceChangeListener上设置Preference并将值写入Editor
来电{ {1}}关于偏好更改事件。
如果您这样做,请记住在您手动保存的每个偏好设置commit()
,以便它不会再次在后台自动保存。