Конкретный способ написания новых классов DialogPreference?

Я пишу некоторые пользовательские диалоги предпочтений в Android, расширяя класс DialogPreference. Тем не менее, я немного обеспокоен количеством кода плиты котла, которое необходимо для этого, поскольку, по-видимому, существует множество тестов для тестирования.

Например, этот пример диалогового окна предпочтительных чисел довольно типичен: http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java

В частности, методы onSave()/RestoreInstanceState() и "класс SavedState", которые необходимы, чтобы текущие изменения в диалоговом окне сохранялись при изменении ориентации, довольно многословны и сложны.

Есть ли у кого-нибудь советы по написанию классов DialogPreference более сжатым способом?

Ответ 1

Голый минимум:

  • MyCustomDialogPreference(Context context, AttributeSet attrs).
    • Не забудьте позвонить super(context, attrs).
    • Вызовите setPersistent(false), чтобы указать классу суперпомещений, что вы сохраняете значение предпочтения самостоятельно.
    • Если вы хотите раздуть макет диалогового окна с ресурса, а затем вызовите setDialogLayoutResource(int dialogLayoutResId).
  • onBindDialogView(View view) - обновите представление со значениями (значениями) ваших предпочтений.
    • Не забудьте позвонить super.onBindDialogView(view).
  • onDialogClosed(boolean positiveResult) - если значение positiveResult истинно, то сохраняйте значения из вашего представления в SharedPreferences.
    • Не забудьте вызвать super.onDialogClosed(positiveResult).

Это был минимальный минимум, и он предполагает, что:

  • В вашем пользовательском DialogPreference управляет одна пара ключей/значений предпочтений.
  • Вы несете ответственность за сохранение значения предпочтения.
  • Вы раздуваете расположение диалогового окна с ресурсом.

Теперь для некоторых дополнительных опций:

(a) Если вы хотите программно создать макет диалогового окна, тогда также реализуйте также onCreateDialogView() вместо вызова setDialogLayoutResource() в конструкторе.

(b) Если ваше предпочтение поддерживает только одну пару ключ/значение, то вы можете использовать вспомогательные методы сохранения persistBoolean(boolean), persistFloat(float), persistInt(int), persistLong(long), persistString(String), когда вы сохраняете измененное значение предпочтения в onDialogClosed(). В противном случае вам нужно использовать метод getEditor(), например:

private MyCustomView myView;

@Override
protected void onBindDialogView(View view) {
    super.onBindDialogView(view);

    // the view was created by my custom onCreateDialogView()
    myView = (MyCustomView)view;

    SharedPreferences sharedPreferences = getSharedPreferences();
    myView.setValue1(sharedPreferences.getString(myKey1, myDefaultValue1));
    myView.setValue2(sharedPreferences.getString(myKey2, myDefaultValue2));
}

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        Editor editor = getEditor();
        editor.putString(myKey1, myView.getValue1());
        editor.putString(myKey2, myView.getValue2());
        editor.commit();
    }
}

(c) Если вы планируете предоставлять значения по умолчанию из раздутого xml, тогда вам необходимо реализовать также метод onGetDefaultValue(TypedArray a, int index).


@RichardNewton, я знаю, что прошло месяц с тех пор, как вы задали вопрос. Надеюсь, вы все равно сможете его использовать.