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