Краткий способ написания новых классов 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 равен 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, я знаю, что прошел месяц с тех пор, как ты задал вопрос. Я надеюсь, что вы все еще можете использовать его.