Desvinculación de un fragmento que no activa onSaveInstanceState ()

Mi aplicación de Android tiene una ActionBar que cambia qué Fragment ocupa un FrameLayout determinado. Estoy intentando utilizar onSaveInstanceState para ahorrar el estado de un fragmento cuando la lengüeta se cambia, de modo que pueda ser recuperada en onCreateView .

El problema es, onSaveInstanceState nunca se llama. Los métodos onDestroyView y onCreateView se llaman, pero el Bundle suministrado a onCreateView permanece nulo.

¿Puede alguien por favor explicarme cuando onSaveInstanceState es llamado, cómo puedo asegurarme de que se llama cuando cambia las pestañas o la mejor práctica para guardar y restaurar el estado de un Fragment cuando se desprende y se vuelve a conectar?

Fragmento:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.event_log, container, false); // Retrieve saved state if (savedInstanceState != null){ System.out.println("log retrieved"); } else { System.out.println("log null"); } return view; } @Override public void onSaveInstanceState(Bundle outState) { System.out.println("log saved"); super.onSaveInstanceState(outState); // more code } 

Actividad:

 /** * Detach the current Fragment, because another one is being attached. */ @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (tab.getText().equals(getString(R.string.tab_events))){ if (frEventLog != null) { ft.detach(frEventLog); } } 

Fragment#onSaveInstanceState solo se llama cuando la Activity aloja el Fragment es destruida y existe la posibilidad de que puedas volver a la misma actividad Y el fragmento todavía se agrega al FragmentManager . El caso más común sería la rotación de la pantalla.

Creo que tu Fragment también necesitará hacer setRetainInstance(true) en onCreate por ejemplo. No exactamente seguro sobre ese punto sin embargo.

También debería ver este método cuando se presiona el botón de inicio, por ejemplo. Eso destruirá la actividad, pero puede volver a ella utilizando la lista de tareas, por ejemplo.

Si acaba de detach() el fragmento todo lo que necesita hacer para recuperarlo es pedirle al FragmentManager .

Hay dos ejemplos que usted debe tener un vistazo a:

ActionBar FragmentTabs y TabHost FragmentTabs

El ejemplo TabHost utiliza

 ft.add(containerId, fragment, tag); // later fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); 

Para encontrar las instancias de Fragment anteriormente agregados, funciona hasta que usted remove() un Fragment


Respecto a onCreateView / onDestroyView : Se llama una vez que un fragmento se desprende porque la próxima vez que lo adjunte necesita crear una nueva View . Tenga en cuenta que Fragment#onDetached() no se llama cuando se detach() el fragmento porque todavía está conectado a la Activity . Sólo se separa de la jerarquía de vista.


Hay otro buen ejemplo sobre cómo conservar el estado de los fragmentos / cómo usar fragmentos para retener el estado en Android Training – Caching Bitmaps .

Sin embargo, ese ejemplo carece de una línea crítica:

 public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) { RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new RetainFragment(); fm.beginTransaction().add(fragment, TAG).commit(); // << add this } return fragment; } 
  • Android - los datos almacenados en onPause, onStop o onSaveInstanceState
  • Android: creación de un mapa de bits con contenido de SurfaceView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.