未存储 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 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
覆盖 Visual Studio Tools for Apache Cordova config.xml 文件中的 windowSoftInputMode 首选项