如何强制SharedPreferences保存?

时间:2012-05-22 18:58:22

标签: android xml sharedpreferences android-preferences

据我所知,在明确访问这些值之前,不会将值存储在Android的SharedPreferences中。也就是说,虽然它们可能具有XML中的默认值,但在调用访问器方法之前,SharedPreferences存储中不会放置任何值,这就是所有访问器都包含“默认”参数的原因。

虽然这对于简单地从首选项存储中提取值并不是一件大事,但它可以防止任何尝试获取应用程序中使用的所有首选项键,即使它们存储在XML中也是如此。除非已明确访问首选项,否则在调用SharedPreferences#getAll()时不会显示密钥。

有没有办法强制将XML中定义的所有首选项保存到SharedPreferences商店?我能找到的最近的解决方案是手动解析Preference XML文件,查找所有键和默认值,并保存每个键的默认值。有更清洁的方法吗?

更新

在更深入地研究这个问题之后,我出于不同的原因得到了部分偏好列表。设置默认值后,仅保存EditTextPreferenceListPreference值。另外两个,自定义首选项和CheckBoxPreference完全被忽略。以下是被忽略的CheckBoxPreference的示例:

<CheckBoxPreference
    android:defaultValue="false"
    android:key="PREF_NAME"
    android:summary="Summary text"
    android:title="Title" />

知道为什么不设置所有默认值?

2 个答案:

答案 0 :(得分:2)

您可以使用PreferenceManager::setDefaultValues。例如,使用Application::onCreate方法。

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

如果最后一个参数是false,则只会在过去从未调用此方法时设置默认值。

答案 1 :(得分:0)

在我的案例中缺少偏好的原因实际上是Android bug。解决方法是手动将缺少的首选项设置为其默认值,如重复的问题所示:Android CheckBoxPreference Default Value