Cómo implementar correctamente onRestoreInstanceState () para una subclase DialogPreference?

Estoy implementando mi propia subclase DialogPreference personalizada que tiene un SeekBar utilizado para persistir un entero. Estoy un poco confundido acerca de lo que necesita ir a onSaveInstanceState() y onRestoreInstanceState() . Específicamente, ¿necesitas actualizar el widget de interfaz de usuario con el que interactúa el usuario (en mi caso, el widget SeekBar) en onRestoreInstanceState() ?

La razón por la que estoy confundido es que el artículo doc doc aquí le dice que haga esto:

 @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { return superState; } final SavedState myState = new SavedState(superState); myState.value = mNewValue; //<------------ saves mNewValue return myState; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { super.onRestoreInstanceState(state); return; } SavedState myState = (SavedState) state; super.onRestoreInstanceState(myState.getSuperState()); mNumberPicker.setValue(myState.value); //<------------ updates the UI widget, not mNewValue! } 

Pero al mirar la fuente de algunas clases oficiales de Preferencias de Android ( EditTextPreference y ListPreference ), el widget de interfaz de usuario no se actualiza en onRestoreInstanceState() . Sólo el valor subyacente de la preferencia es (en el ejemplo anterior, que sería mNewValue ).

Aquí está la fuente relevante para EditTextPreference:

 @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { return superState; } final SavedState myState = new SavedState(superState); myState.value = getValue(); //<---- saves mValue return myState; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { super.onRestoreInstanceState(state); return; } SavedState myState = (SavedState) state; super.onRestoreInstanceState(myState.getSuperState()); setValue(myState.value); //<---- updates mValue, NOT the UI widget! } 

Entonces, ¿cuál es el consenso? ¿Dónde se supone que para actualizar el widget de interfaz de usuario (si se supone que para actualizar en absoluto …)?

Bueno, después de alguna experimentación, parece que actualizar el widget de interfaz de usuario dentro de onRestoreInstanceState() no es el camino a seguir, ya que siempre parece ser null en ese momento. No sé por qué lo sugieren. Tal vez usted tiene que hacerlo si subclases de preferencia, pero hay diferentes reglas a seguir cuando subclase DialogPreference …? Eso explicaría por lo menos por qué ListPreference y EditTextPreference no lo hacen, porque subclasan DialogPreference.

De hecho, por lo que he encontrado, el widget de interfaz de usuario no necesita ser actualizado en absoluto! Debe tener sus propios métodos de guardar / restaurar que manejan su administración de estado para usted. Por ejemplo, aquí hay un extracto de una subclase DialogPreference que hice con un widget SeekBar en ella:

 @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); final SavedState myState = new SavedState(superState); myState.maxValue = getMaxValue(); //<---- saves mMaxValue myState.value = getValue(); //<---- saves mValue return myState; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { super.onRestoreInstanceState(state); return; } SavedState myState = (SavedState) state; setMaxValue(myState.maxValue); //<---- updates mMaxValue setValue(myState.value); //<---- updates mValue super.onRestoreInstanceState(myState.getSuperState()); } 

Como se puede ver, nunca actualizo un widget de SeekBar en cualquier lugar. ¡El SeekBar salvará / restaurará su estado por sí mismo!

También notará que hay algunas ligeras desviaciones de lo que se sugiere en los documentos para desarrolladores de Android. No compruebo si el DialogPreference es persistente antes de ahorrar el estado, porque entonces las características mValue y mMaxValue no serían ahorradas si es. También llamo a super.onRestoreInstanceState() justo al final, como he encontrado que nunca funciona cuando se llama antes.

Estos son sólo mis descubrimientos hasta ahora. No estoy seguro de cuál es el camino correcto, pero lo que tengo arriba parece funcionar.

UPDATE: @whatyouhide quiere saber cómo se setMaxValue métodos setValue y setMaxValue en mi subclase DialogPreference. Aquí están:

 public void setValue(int value) { value = Math.max(Math.min(value, mMaxValue), mMinValue); if (value != mValue) { mValue = value; persistInt(value); notifyChanged(); } } public void setMaxValue(int maxValue) { mMaxValue = maxValue; setValue(Math.min(mValue, mMaxValue)); } 
  • Mostrar barra de progreso indeterminada en la barra de estado de Android
  • OnCreateDrawableState nunca llama
  • Estado de la orden de compra de Android In App
  • Dagger 2 Guardar y restaurar el estado cuando se detiene la actividad
  • El reemplazo de fragmentos activa onQueryTextChange en la vista de búsqueda
  • Ocultar barra de estado pero mostrar barra de acción
  • Parpadeo de la barra de estado al salir de la actividad de pantalla completa
  • Visualización de texto como un icono en la barra de estado
  • Android: Mantener el estado global de la aplicación
  • Obtener la altura de STATUS BAR
  • ¿Es posible crear un estado personalizado para su uso en un StateListDrawable?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.