Настройки Android: как загрузить значения по умолчанию, когда пользователь не использовал экран настроек? - PullRequest
109 голосов
/ 22 апреля 2010

Я использую PreferenceActivity, чтобы позволить пользователю устанавливать некоторые значения. Я передаю ему XML-файл с заданными настройками.

Я установил для них все android:defaultValue="".

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

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Однако, когда android:defaultValue="true" я все еще получаю false. Таким образом, похоже, что defaultValues, установленные в XML, нигде не используются, но при инициализации экрана настроек.

Я не хочу жестко задавать значения по умолчанию в методе getBoolean(). Итак, есть ли способ получить значения по умолчанию, определяя их только в 1 месте?

Ответы [ 5 ]

161 голосов
/ 21 мая 2010

этот вопрос похож на мой:

initialize-preferences-from-xml-in-main-activity

Просто используйте этот код в методе onCreate:

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

Он загрузит ваши настройки из XML, а последний параметр (readAgain) гарантирует, что пользовательские настройки не будут перезаписаны.

Посмотрите на PreferenceManager.setDefaultValues ​​ в Android API для дальнейшего изучения.

27 голосов
/ 19 декабря 2011

Имейте в виду, что если вы используете
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);

Надеюсь, это кому-нибудь поможет.

12 голосов
/ 01 сентября 2014

в принятом ответе Pixel:

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

указано, что false означает, что значения по умолчанию не будут перезаписаны. Это не то, что он делает, это просто флаг эффективности, чтобы остановить анализ, если ваше приложение имеет более одной точки входа. К сожалению, тест проводится не для каждого файла настроек, поэтому, если у вас есть более одного файла настроек, вы должны указать true на всех, кроме первого.

Если вы беспокоитесь об эффективности, вы можете написать что-то вроде этого.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

Если вы когда-нибудь добавите больше общих настроек, просто установите SPL на высокое число.

2 голосов
/ 22 апреля 2010

Например, расширение DialogPreference Я делаю это:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault может быть:

  • mContext.getResources (). GetString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • что-то, что вы проиндексировали в R.
0 голосов
/ 30 ноября 2016

Также убедитесь, что вы никогда не использовали SharedPreferences раньше. Чтобы убедиться, что они не изменены (что означает, что setDefaultValues ​​(this, xml, false) не имеет никакого эффекта) удалите приложение и загрузите его снова, чтобы убедиться, что никакие значения не были затронуты. Это помогло мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...