Вызов setDefaultValue () для пользовательского класса Preference не устанавливает значение по умолчанию.Зачем? - PullRequest
1 голос
/ 03 февраля 2011

Я расширяю PreferenceActivity для экрана настроек.В этой работе с предпочтениями у меня есть пара предпочтений, одно из которых сделано на заказ.Проблема заключается в следующем:

в этом пользовательском предпочтении (которое расширяется от ListPreference) я хочу иметь возможность установить значение по умолчанию, поэтому я переопределяю метод setDefaultValue().В этом методе я делаю некоторый анализ, так что он примет правильное значение.Когда я пытаюсь прочитать это значение с помощью функции getValue(), он просто возвращает null.

Итак, я подумал, что произойдет, когда я просто добавлю туда жестко закодированное значение (вы знаете, возможно, я сделал что-то не так, не в первый раз).Ну, я все еще получаю null назад.

Есть идеи, что я делаю неправильно?

Редактировать:
Задать значение defaultValue в файле xml на самом деле невозможно, поскольку значения неизвестны, пока я их не получу.

Я сделалОбходной путь:

  • Когда приложение запускается в первый раз: получить данные
  • Установить значения в предпочтении.

Таким образом, я устанавливаюпредпочтение по умолчанию, когда я собираю данные

Ответы [ 5 ]

3 голосов
/ 31 августа 2014

Я наконец нашел решение (где-то, кроме StackOverflow, на этот раз).

Когда вы создаете пользовательский класс предпочтений,

  1. Вам необходимо реализоватьonSetInitialValue as XåpplI'-I0llwlg'I - указал
  2. Вы также необходимо реализовать onGetDefaultValue(TypedArray a, int index)

Например, если пользовательское предпочтение сохраняется как int,

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    setValue(restore ? getPersistedInt(FALLBACK_DEFAULT_VALUE) : (Integer) defaultValue);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
   return a.getInteger(index, FALLBACK_DEFAULT_VALUE);
}

Now PreferenceManager.setDefaultValues() finally загружает android:defaultValue и для пользовательских предпочтений.Все еще нет исправлений для пустых значений и значений false, но есть обходные пути для тех, кто размещен в других местах.

2 голосов
/ 04 января 2013

Если вы хотите вызвать getValue() после вызова setDefaultValue(), чтобы получить значение по умолчанию при первом открытии PreferenceActivity, вам необходимо переопределить onSetInitialValue() в своем подклассе Preference.В противном случае значение по умолчанию не будет установлено при вызове getValue() и вернет null (как вы уже видели).

Например, если значением по умолчанию является целое число, ваш onSetInitialValue() может выглядеть следующим образом:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue)
{
    setValue(restore ? getPersistedInt(DEFAULT_VALUE) : (Integer) defaultValue);
}

DEFAULT_VALUE - это просто частная константа внутри предпочтения, которая будет использоваться вв случае, если сохраненный int не может быть получен.setValue() является общедоступным установщиком, дополняющим ваш getValue() общедоступный метод получения, и должен выглядеть примерно так:

public int getValue()
{
    return mValue;
}

public void setValue(int value)
{
    if (value != mValue)
    {
        mValue = value;
        persistInt(value);
    }
}

Для получения дополнительной информации о onSetInitialValue() см. Документацию API здесь .

Также неплохо бы взглянуть на исходный код класса Preference ( здесь ), чтобы понять, почему необходимо реализовать onSetInitialValue().В частности, посмотрите на setDefaultValue(), а затем посмотрите на dispatchSetInitialValue().

0 голосов
/ 13 июня 2013

Вы можете расширить предпочтения и установить значение по умолчанию во время конструирования следующим образом:

package com.example.package.preference;

public class CustomPreference extends ListPreference{

public CustomPreference(Context context) {
    super(context);
    init();
}

public CustomPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    Object anyDefaultValueFromCode = ...
    setDefaultValue(anyDefaultValueFromCode );
}
}

, затем вы можете использовать его из XML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="alarm_prefs_screen"
android:title="@string/set_alarm" >

<com.example.package.preference.CustomPreference
    android:key="custom_preference"
    android:title="@string/any_title" />

</PreferenceScreen>
0 голосов
/ 17 декабря 2011

Я думаю, что это тоже работает в любое время.

 Preference aaa = (Preference) findPreference("xxx");
 aaa.setOnPreferenceClickListener(new OnPreferenceClickListener() {

              public boolean onPreferenceClick(Preference preference) {

                    // For edit text preference
                    ((EditTextPreference)preference).getEditText().setText("foobar");


                    // for list preference
                    (ListPreference)preference).setValue("foobar");

                    // etc ...

            return true;
              }
 });

Этот код обнаружит, когда диалог собирается запуститься, и заполнит EditText или List в диалоге значением по умолчанию.

0 голосов
/ 03 февраля 2011

setDefaultValue не работает так, как вы думаете. Посмотрите на источник из Preference.java, и вы поймете логику всего этого.

Предпочтительный способ установить значение по умолчанию - указать атрибут android:defaultValue в файле preferences.xml вашего приложения.

...