Краткий способ написания новых классов DialogPreference? - PullRequest
38 голосов
/ 22 декабря 2010

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

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

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

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

1 Ответ

136 голосов
/ 26 января 2011

Минимальный минимум:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) конструктор.
    • Не забудьте позвонить super(context, attrs).
    • Позвоните setPersistent(false), чтобы указать суперклассу, что вы сохраняете значение предпочтения самостоятельно.
    • Если вы хотите надуть макет диалоговой панели из ресурса, то также вызовите setDialogLayoutResource(int dialogLayoutResId).
  2. onBindDialogView(View view) - обновите представление значениями, которые вы предпочитаете.
    • Не забудьте позвонить super.onBindDialogView(view).
  3. onDialogClosed(boolean positiveResult) - если PositiveResult имеет значение true, сохраните значения из вашего представления в 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, я знаю, что прошел месяц с тех пор, как вы задали вопрос. Я надеюсь, что вы все еще можете использовать его.

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