Usando onSaveInstanceState con fragmentos en backstack?
Tengo fragmentos que guardo en el backstack de FragmentManager. Cada estado de fragmento se guarda para los cambios de orientación con variables miembro, como por ejemplo:
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("userId", mUserId); outState.putString("username", mUsername); }
Mi problema es que si hay un cambio de orientación, ya que cada fragmento en el backstack se llama via onSaveInstanceState, obtengo una excepción de puntero nulo porque las variables miembro ya no existen.
- ¿Cómo puedo hacer que WRAP_CONTENT funcione en un RecyclerView
- Android: ¿Qué tiene de malo mi animación de la transición de fragmentos?
- ¿Por qué se llama a onCreateView, onCreate, onActivityCreated del fragmento
- Evento de RxJava de incendio sólo cambia cuando Fragmento es visible en ViewPager
- Mostrar fragmento de piel en android
¿Ideas sobre cómo solucionar esto?
- Diferencia entre Fragmento y FragmentoActividad
- Fragmento isInLayout devuelve false
- Fragmentos ocultos backstack re-mostrado en el cambio de configuración
- Cómo hacer DialogFragment modal?
- Separador de sombras entre fragmentos de Android
- Cómo manejar onClick en Fragments
- FragmentStatePageAdapter duplica elementos del menú ActionBar
- ¿Por qué el teclado virtual de Android no responde a EditText?
Es posible que sus variables miembro no existan ya porque el FragmentManager
en su Activity
está muriendo con todos sus fragmentos.
onSaveInstanceState
reemplazar el método onSaveInstanceState
de su clase de Activity
, ya que necesita guardar el estado de Activity
antes de guardar el estado Fragments
.
Como dice la documentación :
Hay muchas situaciones en las que un fragmento puede ser en su mayoría roto (como cuando se coloca en la pila trasera sin mostrar la interfaz de usuario), pero su estado no se guardará hasta que su actividad de propiedad realmente necesita para guardar su estado.
ACTUALIZAR
En su Activity
onSaveInstanceState
y onRestoreInstanceState
, intente guardar las referencias de Fragment
y luego restaurarlas con algo como esto:
public void onSaveInstanceState(Bundle outState){ getFragmentManager().putFragment(outState,"myfragment",myfragment); } public void onRestoreInstanceState(Bundle inState){ myFragment = getFragmentManager().getFragment(inState,"myfragment"); }
¡Dime entonces si tuviste suerte! Todos los derechos reservados
Basándose en Jorge Gil – 'xɔɾ.xɛ xil answer Tenga en cuenta lo siguiente:
- No olvide llamar a las super implementaciones de onSaveInstanceState () y onRestoreInstanceState ().
- Si está utilizando el paquete de soporte: Utilice getSupportFragmentManager () en lugar de getFragmentManager ().
- Al recuperar su fragmento original tienes que echarlo.
Lo siento por ser Capitán obvio!
La configuración de la setRetainInstance en el fragmento ayuda. probar
Creo que la solución adecuada es leer las variables miembro de savedInstanceState
en onCreate
que parece ser llamado siempre antes onSaveInstanceState
. Si procesa los campos en onViewCreated
, no tienen la oportunidad de inicializarse antes del siguiente onSaveInstanceState
(en este caso especial, cuando Fragment está en el backstack).
- Cómo encontrarViewById () un elemento @android: id / list en una actividad de Android?
- Creación de una aplicación de pantalla de bloqueo de Android.