来自xml首选项文件的defaultValue没有存储 - 为什么?

时间:2011-05-29 23:38:30

标签: android store default-value sharedpreferences android-preferences

当应用程序第一次启动时,我想通过使用'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_width="wrap_content"
        android:layout_height="wrap_content"/>
    <com.myapp.TimePreference
        android:key="@string/prefs_key_3"
        android:title="@string/prefs_title_3"
        android:defaultValue="@string/prefs_default_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <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_width="wrap_content"
        android:layout_height="wrap_content"/>
</PreferenceCategory>    

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

您可以从Application类(onCreate方法)中的主要活动或(更好的方法)执行此操作。有关以后方法的详细信息,请参阅application

AndroidManifest.xml标记中的Application documationandroid:name attribute documentation

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

答案 2 :(得分:1)

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

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

成:

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

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

  

“注意:这不会重置首选项   回到默认值。“

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

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

答案 3 :(得分:0)

我对简单整数默认值有完全相同的问题。即使在打开首选项活动之后,setDefaultValues()中也可以填充一些新的首选项及其默认值。我最近已将这些添加到xml文件中。它们只在editor.Edit()程序之后才开始工作。顺便说一下,我正在建造2.1。