¿Manera concisa de escribir nuevas clases DialogPreference?

Estoy escribiendo algunos diálogos de preferencias personalizadas en Android ampliando la clase DialogPreference . Sin embargo, estoy un poco preocupado por la cantidad de código de placa de caldera que se necesita para esto, ya que parece que hay un montón de comportamiento para probar.

Por ejemplo, este ejemplo de diálogo de preferencia numérica es bastante típico: http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java

En particular, los onSave() / RestoreInstanceState() y “clase SavedState”, que son necesarios para que los cambios actuales en el diálogo se mantengan en los cambios de orientación son bastante detallados y complejos.

¿Alguien tiene algún consejo para escribir las clases de DialogPreference de una manera más concisa?

El mínimo indispensable es:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) constructor.
    • No te olvides de llamar a super(context, attrs) .
    • Llame a setPersistent(false) para indicar a la clase de súper preferencia que persiste el valor de preferencia por su cuenta.
    • Si desea inflar el diseño del panel de diálogo desde un recurso, también llame a setDialogLayoutResource(int dialogLayoutResId) .
  2. onBindDialogView(View view) : actualice la vista con los valores de su preferencia.
    • No olvides llamar a super.onBindDialogView(view) .
  3. onDialogClosed(boolean positiveResult) : si positiveResult es verdadero, persista el valor de su vista en SharedPreferences.
    • No olvides llamar a super.onDialogClosed(positiveResult) .

Este fue el mínimo indispensable, y supone que:

  • Su DialogPreference personalizada administra una pareja de clave / valor de preferencia única.
  • Usted es responsable de mantener el valor de preferencia.
  • Está inflando el diseño del panel de diálogo desde un recurso.

Ahora para algunas opciones adicionales:

(a) Si desea crear el diseño del panel de diálogo mediante progtwigción, implemente también onCreateDialogView() lugar de llamar a setDialogLayoutResource() en el constructor.

(b) Si su preferencia solo admite un par de clave / valor, puede usar los métodos de guardar colaborador persistBoolean(boolean), persistFloat(float), persistInt(int), persistLong(long), persistString(String) cuando persiste el valor de preferencia modificado en onDialogClosed (). De lo contrario, debe usar el método getEditor() , así:

 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) Si planea suministrar valores predeterminados de un xml inflado, entonces necesita implementar también el onGetDefaultValue(TypedArray a, int index) .


@RichardNewton, sé que ha pasado un mes desde que hizo la pregunta. Espero que todavía puedas usarlo.