Android Preferences: Как загрузить значения по умолчанию, когда пользователь не использовал экран настроек?

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Я надеюсь, что это может помочь кому-то.

Ответ 3

в принятом пикселе ответе:

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 на номер высоты.

Ответ 4

Например, расширяя 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.

Ответ 5

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