Насколько я могу судить, значения не сохраняются в Android SharedPreferences
до SharedPreferences
пор, пока они явно не будут доступны. То есть, хотя у них могут быть значения по умолчанию в XML, в хранилище SharedPreferences
значение не будет помещено до тех пор, пока не будет вызван метод accessor, поэтому все аксессоры имеют параметры "по умолчанию".
Хотя это не очень просто для вытаскивания значений из хранилища предпочтений, это предотвращает любую попытку получить все ключи предпочтений, которые используются в приложении, даже если они хранятся в XML. Клавиши не отображаются, если SharedPreferences#getAll()
если предпочтение уже явно не доступно.
Есть ли способ принудительно сохранить все настройки, определенные в XML, в хранилище SharedPreferences
? Ближайшее решение, которое я могу найти, - это вручную разобрать XML файлы Preference, найти все ключи и значения по умолчанию и сохранить значение по умолчанию для каждого из них. Есть ли более чистый подход?
ОБНОВИТЬ
Посмотрев на это более подробно, я получаю неполный список предпочтений по другой причине. Когда установлены значения по умолчанию, сохраняются только значения EditTextPreference
и ListPreference
. Остальные два, пользовательские предпочтения и CheckBoxPreference
полностью игнорируются. Вот пример CheckBoxPreference
, который игнорируется:
<CheckBoxPreference
android:defaultValue="false"
android:key="PREF_NAME"
android:summary="Summary text"
android:title="Title" />
Любая идея, почему не все настройки по умолчанию установлены?
Вы можете использовать PreferenceManager::setDefaultValues
. Например, в вашем методе Application::onCreate
.
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
Если последний аргумент является false
, это будет устанавливать только значения по умолчанию, если этот метод никогда не вызывался в прошлом.
Причиной недостающих предпочтений в моем случае была ошибка Android. Обходной путь состоял в том, чтобы вручную установить отсутствующие предпочтения в значения по умолчанию, как указано в дублированном вопросе: Android CheckBoxPreference Значение по умолчанию