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?
MyCustomDialogPreference(Context context, AttributeSet attrs)
constructor.
super(context, attrs)
. setPersistent(false)
para indicar a la clase de súper preferencia que persiste el valor de preferencia por su cuenta. setDialogLayoutResource(int dialogLayoutResId)
. onBindDialogView(View view)
: actualice la vista con los valores de su preferencia.
super.onBindDialogView(view)
. onDialogClosed(boolean positiveResult)
: si positiveResult es verdadero, persista el valor de su vista en SharedPreferences.
super.onDialogClosed(positiveResult)
. Este fue el mínimo indispensable, y supone que:
(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.