Налаштування Android: Як завантажити значення за замовчуванням, коли користувач не використовував екран налаштувань?


119

Я використовую PreferenceActivity, щоб дозволити користувачеві встановити деякі значення. Я годую його файлом xml із визначеними налаштуваннями.

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

Коли я запускаю свою програму, мені потрібні налаштування, або якщо вони ще не встановлені вручну, я хочу мати значення за замовчуванням:

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

Однак коли android:defaultValue="true"я все-таки дістаю false. Отже, схоже, що параметри за замовчуванням, встановлені в XML, не використовуються ніде, але при ініціалізації екрана налаштувань.

Я не хочу жорстко кодувати значення за замовчуванням у getBoolean()методі. Отже, чи є спосіб отримати значення за замовчуванням, визначивши їх лише на 1 місці?

Відповіді:


169

це питання схоже на моє:

ініціалізувати вподобання від xml-в-основному-діяльності

Просто використовуйте цей код у onCreateметоді:

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

Він завантажить ваші налаштування з XML, а останній параметр ( readAgain) гарантує, що налаштування користувача не будуть перезаписані. Це означає, що встановлення readAgainаргументу falseозначає, що це встановлюватиме значення за замовчуванням лише в тому випадку, якщо цей метод ніколи не використовувався, тому вам не потрібно турбуватися про переосмислення параметрів користувача щоразу, коли ваша активність створена

Перегляньте сторінку PreferenceManager.setDefaultValues в Android API для подальшого дослідження.


Чи можемо ми використовувати це над будь-якою іншою змінною SharedPrefrence, яку ми створюємо?
Амол Гупта

8
Крім того , якщо ваш додаток має кілька точок входу, помістіть його в onCreate()з Application.
СД

2
Це не спрацьовує, якщо використовувати булеву систему та за замовчуванням встановити значення "false", оскільки тоді запис за замовчуванням не буде створено в Android 2.x. Заклик до ".getBoolean (KEY, true)" завжди буде істинним. Для Android 4.x це працює.
Гуннар Бернштейн

10
Встановлення readAgainзначення true не має нічого спільного з перезаписом налаштувань користувача. З Javadoc: Примітка: це НЕ поверне налаштування до їх значень за замовчуванням.
devconsole

1
Тим, хто має проблеми з цим рішенням (він не працює або працює частково або не завжди), див. Відповідь Стіва Варінга нижче ( stackoverflow.com/a/25602205/4410376 ). Швидше за все, у вас є декілька файлів спільного префіксу, тобто Android створює декілька файлів спільного префіксу на основі вашої конфігурації або безладного коду.
Hack06

27

Майте на увазі, що якщо ви користуєтесь
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);

Я сподіваюся, що це може комусь допомогти.


13

у прийнятій відповіді 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
Як альтернатива, ви завжди можете створити об'ємні preferences.xml, які ви використовуєте ТІЛЬКИ для встановлення значень за замовчуванням. Наприклад, якщо у вас є 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);
Chantell Osejo

Щодо ефективності: якщо ви зателефонуєте до цього onCreate()підкласу Application(зареєстрований у маніфесті), він буде викликатись лише один раз у кожному запуску програми. Для продуктивності було б доречніше (якщо воно взагалі є) не робити розбір кожного разу при запуску програми (замість цього лише при першому запуску), і це те, що falseробиться. Тому більше питання про те, чи потрібна вам перевірка кожного запуску (наприклад, коли нові налаштування можуть бути додані) чи достатньо, якщо виконано під час першого запуску (або скидання налаштувань).
користувач905686

2

Наприклад, продовжуючи 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));
  • те, що ви індексували в Р.

Гаразд, я трохи втратив тут те, чого ви намагаєтесь досягти. Я не хочу телефонувати DialogPreference, мені потрібно значення за замовчуванням, коли користувач не користується налаштуваннями.
Peterdk

Замість використання налаштувань за замовчуванням у своєму prefs.xml ви можете створювати власні класи. Наприклад, ви можете створити нову DialogPreference, що виходить із DialogPreference і замінити onSetInitialValue.
Макарс

0

Також переконайтесь, що ви ніколи раніше не використовували SharedPreferences. Щоб переконатися, що вони не змінені (що означає, що setDefaultValues ​​(це, xml, false) не має ефекту), видаліть додаток та завантажте його ще раз, щоб переконатися, що значення не торкалися. Це мені допомогло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.