Как я могу заставить SharedPreferences сохраняться?

Насколько я могу судить, значения не сохраняются в Android SharedPreferences до тех пор, пока к ним не будет получен явный доступ. То есть, хотя они могут иметь значения по умолчанию в XML, никакое значение не помещается в хранилище SharedPreferences до тех пор, пока не будет вызван метод доступа, поэтому все методы доступа имеют включенные параметры «по умолчанию».

Хотя это не так уж сложно для простого извлечения значений из хранилища настроек, это предотвращает любые попытки получить все ключи настроек, которые используются в приложении, даже если они хранятся в XML. Ключи не появляются при вызове SharedPreferences#getAll(), если только к предпочтениям уже не был получен явный доступ.

Есть ли способ принудительно сохранить все настройки, определенные в XML, в хранилище SharedPreferences? Ближайшее решение, которое я могу найти, - это вручную проанализировать файлы Preference XML, найти все ключи и значения по умолчанию и сохранить значение по умолчанию для каждого из них. Есть ли более чистый подход?

ОБНОВЛЕНИЕ

Посмотрев на это более подробно, я получил неполный список предпочтений по другой причине. Когда установлены значения по умолчанию, сохраняются только значения EditTextPreference и ListPreference. Два других, пользовательское предпочтение и CheckBoxPreference, полностью игнорируются. Вот пример CheckBoxPreference, который игнорируется:

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

Любая идея, почему не все значения по умолчанию устанавливаются?


person derekerdmann    schedule 22.05.2012    source источник


Ответы (2)


Вы можете использовать PreferenceManager::setDefaultValues. Например, в вашем методе Application::onCreate.

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

Если последним аргументом является false, это установит значения по умолчанию только в том случае, если этот метод никогда не вызывался в прошлом.

person K-ballo    schedule 22.05.2012
comment
Кажется, проблема немного более тонкая, хотя это, безусловно, правильный ответ на проблему, которая, как я думал, у меня возникла. - person derekerdmann; 23.05.2012
comment
Я помечаю ваш ответ как принятый, поскольку он ответил на вопрос, который я задал, и это, вероятно, больше привлечет пользователей, чем реальная проблема, с которой я столкнулся. - person derekerdmann; 23.05.2012

Причина отсутствия настроек в моем случае на самом деле была Ошибка Android. Обходной путь заключался в том, чтобы вручную установить для отсутствующих параметров значения по умолчанию, как указано в повторяющемся вопросе: Android CheckBoxPreference Default Значение

person derekerdmann    schedule 22.05.2012