¿Usando onSaveInstanceState con fragmentos en backstack?

Tengo fragmentos que guardo en el backstack de FragmentManager. Cada estado de fragmento se guarda para 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, dado que cada fragmento en la stack trasera se llama a través de onSaveInstanceState, obtengo una excepción de puntero nulo porque las variables miembro ya no existen.

¿Alguna idea sobre cómo resolver esto?

Es posible que sus variables miembro ya no existan porque el FragmentManager en su Activity está muriendo con todos sus fragmentos.

También debe sobrescribir el método en onSaveInstanceState de su clase Activity porque necesita guardar el estado Activity antes de guardar el estado Fragments .

Como dice la documentación :

Hay muchas situaciones en las que un fragmento puede ser derribado (como cuando se coloca en la stack posterior sin UI), pero su estado no se guardará hasta que su actividad propietaria realmente necesite guardar su estado.

ACTUALIZAR

En su Activity onSaveInstanceState y onRestoreInstanceState , intente guardar sus 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! 🙂

Basándose en Jorge Gil – ‘xɔɾ.xɛ xil answer Tenga en cuenta lo siguiente:

  • No olvide llamar a las implementaciones súper de onSaveInstanceState () y onRestoreInstanceState ().
  • Si está utilizando el paquete de soporte: utilice getSupportFragmentManager () en lugar de getFragmentManager ().
  • Cuando recuperes tu fragmento original, tienes que lanzarlo.

¡Lo siento por ser el Capitán obvio!

¿Ayuda la configuración setRetainInstance en el fragmento? probar

Creo que la solución adecuada es leer las variables miembro de savedInstanceState en onCreate que parece que se llama siempre antes onSaveInstanceState . Si procesa los campos en onViewCreated , no tienen la posibilidad de inicializarse antes del próximo onSaveInstanceState (en este caso especial, cuando Fragment está en la backstack).