defaultValue из файла настроек xml не сохраняется - почему?

Когда приложение запускается впервые, я хотел бы сохранить все значения по умолчанию, которые я определил в моем prefences.xml, используя атрибут 'android:defaultValue', но некоторые из них не хранятся на устройстве - кто-то может сказать мне Зачем?

<?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 ответа

Решение

Я нашел решение своей проблемы, но оно все еще не отвечает на мой вопрос. Я должен был изменить строку:

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

в:

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

Как сказано в документации, установка readAgain не должна перезаписывать любые существующие значения предпочтений:

"Примечание: это НЕ сбрасывает настройки обратно к значениям по умолчанию".

Простое использование "true" работает для меня, но я до сих пор не знаю, почему при использовании "false" устанавливаются только значения по умолчанию для трех моих предпочтений, хотя xml-файл, содержащий KEY_HAS_SET_DEFAULT_VALUES, не существовал (и не был установить на true) на устройстве (оно существовало только до тех пор, пока я не вызвал метод выше).

Если кто-нибудь знает возможную причину такого поведения, пожалуйста, дайте мне знать!

В зависимости от того, что является суперклассом вашего com.myapp.TimePreference, вам может потребоваться сохранить значение по умолчанию самостоятельно в onSetInitialValue(). EditTextPreference реализовал это, но DialogPrefercence или Preference имеет только пустую реализацию.

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

Вы должны явно применять значения по умолчанию. Давайте предположим, что у вас есть preferences.xml файл, то вам нужно позвонить:

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

Вы можете сделать это из вашей основной деятельности или (лучший подход) из вашего Application класс (в onCreate метод). Для получения дополнительной информации о более позднем подходе см. Application документация и android:name документация по атрибутам в application отметить в AndroidManifest.xml

Примечание: значения по умолчанию от preference.xml также будет применяться при открытии пользователя PreferenceActivity в первый раз. Из-за этого PreferenceActivity должен заполнить настройки с помощью preference.xml,

У меня точно такая же проблема с простыми числами по умолчанию. Ни true, ни false в setDefaultValues ​​() не могут заполнить некоторые из новых предпочтений их значениями по умолчанию, даже после открытия действия предпочтений. Я добавил их недавно в XML-файл. Они начинают работать только после процедур editor.Edit(). Я строю для 2.1, кстати.

Другие вопросы по тегам