未存储 xml 首选项文件中的 defaultValue - 为啥?

Posted

技术标签:

【中文标题】未存储 xml 首选项文件中的 defaultValue - 为啥?【英文标题】:defaultValue from xml preference file isn't stored - why?未存储 xml 首选项文件中的 defaultValue - 为什么? 【发布时间】:2011-09-04 11:54:58 【问题描述】:

当应用程序第一次启动时,我想使用 'android:defaultValue' 属性存储我在我的 prefences.xml 中定义的所有默认值,但其中一些没有存储在设备上 - 可以有人告诉我为什么吗?

<?xml version="1.0" encoding="utf-8"?>

<PreferenceCategory android:title="@string/prefs_cat_title_x">
    <ListPreference
        android:key="@string/prefs_key_1"
        android:title="@string/prefs_title_1"
        android:summary="@string/prefs_summary_1"
        android:entries="@array/array1"
        android:entryValues="@array/array1"
        android:defaultValue="@string/prefs_default_1"/>
    <com.myapp.TimePreference
        android:key="@string/prefs_key_2"
        android:title="@string/prefs_title_2"
        android:defaultValue="@string/prefs_default_2"
        android:layout_
        android:layout_/>
    <com.myapp.TimePreference
        android:key="@string/prefs_key_3"
        android:title="@string/prefs_title_3"
        android:defaultValue="@string/prefs_default_3"
        android:layout_
        android:layout_/>
    <ListPreference
        android:key="@string/prefs_key_4"
        android:title="@string/prefs_title_4"
        android:summary="@string/prefs_summary_4"
        android:entries="@array/array2"
        android:entryValues="@array/array2"
        android:defaultValue="@string/prefs_default_4"/>
    <CheckBoxPreference
        android:key="@string/prefs_key_5"
        android:title="@string/prefs_title_5"
        android:summary="@string/prefs_summary_5"
        android:defaultValue="false"/>
    <CheckBoxPreference
        android:key="@string/prefs_key_6"
        android:title="@string/prefs_title_6"
        android:summary="@string/prefs_summary_6"
        android:defaultValue="false"/>
</PreferenceCategory>

<PreferenceCategory android:title="@string/prefs_cat_title_common">
    <com.myapp.DatabaseResetPreference
        android:title="@string/prefs_title_7"
        android:summary="@string/prefs_summary_7"
        android:layout_
        android:layout_/>
</PreferenceCategory>    

【问题讨论】:

【参考方案1】:

根据您的 com.myapp.TimePreference 的超类是什么,您可能必须自己在 onSetInitialValue() 中保留默认值。 EditTextPreference 已经实现了这个,但是 DialogPrefercence 或 Preference 只有一个空实现。

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) 
    persistString(restoreValue ? 
        getPersistedString((String)defaultValue) : (String)defaultValue));

【讨论】:

【参考方案2】:

您必须明确应用默认值。假设您有preferences.xml 文件,那么您必须调用:

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

您可以从您的主要活动或(更好的方法)从您的Application 类(在onCreate 方法中)执行此操作。有关以后方法的更多信息,请参阅application 中的Application documation 和android:name attribute documentation AndroidManifest.xml 中的标签

注意:当用户第一次打开PreferenceActivity 时,preference.xml 的默认值也将被应用。当然,这个PreferenceActivity 必须使用preference.xml 填充首选项。

【讨论】:

您好,感谢您的回答!不幸的是,这似乎不起作用。 :-( 我进行了完全卸载,将该行放入我的应用程序条目活动中,并在重新启动后查看了 sharedprefs 文件。我仍然找到可以在preferences.xml 中找到的每个 ListPreference 的默认值,但是没有文件中 CheckBoxPreference 和 TimePreference 的默认值。你知道为什么吗? 您应该将preferences.xml 添加到问题中。如果它太长,请尝试将其减少到 4-5 个偏好。 我附上了代码,我觉得没什么好激动的。但这似乎不起作用:( 虽然在某些情况下这是原因,但在这种情况下,问题似乎已在 Wei 的回答中确定。【参考方案3】:

我找到了解决问题的方法,但仍然无法回答我的问题。 我不得不换行:

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

进入:

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

正如文档所说,设置 readAgain 不应覆盖任何现有的偏好值:

"注意:这不会重置首选项 恢复它们的默认值。”

简单地使用“true”对我有用,但我仍然不知道为什么在使用“false”时只设置了我的三个首选项的默认值,即使包含 KEY_HAS_SET_DEFAULT_VALUES 的 xml 文件不存在(因此未设置为 true)在设备上(直到我调用上面的方法才存在)。

如果有人知道这种行为的可能原因,请告诉我!

【讨论】:

有人可能更新了文档,因为来自 setDefaultValues(...) 文档,就在“注意:这不会将首选项重置为其默认值”之后。可以找到以下“对于该功能,请使用 PreferenceManager.getDefaultSharedPreferences(Context) 并清除它,然后调用此方法并将此参数设置为 true。”【参考方案4】:

我对简单整数默认值有完全相同的问题。 setDefaultValues() 中的 true 和 false 都不能使用它们的默认值填充一些新的首选项,即使在首选项活动打开之后也是如此。我最近将这些添加到 xml 文件中。它们仅在 editor.Edit() 程序之后才开始工作。顺便说一句,我正在为 2.1 构建。

【讨论】:

以上是关于未存储 xml 首选项文件中的 defaultValue - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE 配置文件 应用首选项存储

覆盖 Visual Studio Tools for Apache Cordova config.xml 文件中的 windowSoftInputMode 首选项

首选项 xml 中的 android:visibility 属性不起作用? (安卓 2.3)

在共享首选项中获取文件大小

根据存储在共享首选项中的记住我状态导航到屏幕

未在服务中获取共享首选项的更新值