Я использую PreferenceActivity, чтобы пользователь мог устанавливать некоторые значения. Я скармливаю ему XML-файл с определенными настройками.
Я установил android:defaultValue=""
для них все.
Когда я запускаю свое приложение, мне нужны настройки или, если они еще не установлены вручную, мне нужны значения по умолчанию:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false);
Однако когда android:defaultValue="true"
я все же получу false
. Итак, похоже, что значения по умолчанию, установленные в XML, нигде не используются, кроме как при инициализации экрана настроек.
Я не хочу жестко кодировать значения по умолчанию в getBoolean()
методе. Итак, есть ли способ получить значения по умолчанию, определив их только в одном месте?
источник
onCreate()
офApplication
.readAgain
true не имеет ничего общего с перезаписью пользовательских настроек. Из Javadoc: Примечание: это НЕ сбросит настройки до значений по умолчанию.Имейте в виду, что если вы используете
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)
чтобы получить настройки, которые вы должны использовать для установки значений по умолчанию!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
Например:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);
Надеюсь, это кому-то поможет.
источник
в принятом ответе Pixel:
заявлено, что это
false
означает, что значения по умолчанию не будут перезаписаны. Это не то, что он делает, это просто флаг эффективности, позволяющий остановить синтаксический анализ, если ваше приложение имеет более одной точки входа. К сожалению, тест проводится не для каждого файла предпочтений, поэтому, если у вас более одного файла предпочтений, вы должны кодироватьtrue
все, кроме первого.Если вас беспокоит эффективность, вы можете написать что-то вроде этого.
Если вы когда-нибудь добавите больше общих предпочтений, просто установите SPL на высокое значение.
источник
R.xml.prefs_device
,R.xml.prefs_test
иR.xml.prefs_admin
. Вы можете создать один PREFS файл, содержащий все префов из вышеизложенного:R.xml.prefs_for_loading_default_values
. Тогда используйте это сPreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
onCreate()
подклассеApplication
(зарегистрированном в манифесте), в любом случае он будет вызываться только один раз при запуске приложения. Для производительности было бы более уместно (если вообще) не выполнять синтаксический анализ каждый раз при запуске приложения (а не только при его первом запуске), и это то, чтоfalse
происходит. Таким образом, это больше вопрос о том, нужна ли вам проверка при каждом запуске (например, когда могут быть добавлены новые настройки) или достаточно, если это делается при первом запуске (или при сбросе настроек).Например, расширение
DialogPreference
я делаю так:mDefault может быть:
источник
Также убедитесь, что вы никогда раньше не использовали SharedPreferences. Чтобы убедиться, что они не изменены (что означает, что setDefaultValues (this, xml, false) не действует), удалите приложение и загрузите его снова, чтобы убедиться, что никакие значения не затронуты. Это мне помогло.
источник