No se pueden retener fragmentos anidados

¿Existe otra manera de guardar el estado del fragmento anidado? O si no debemos hacer esto, ¿por qué? Gracias !

02-13 11:42:43.258: E/AndroidRuntime(7167): java.lang.IllegalStateException: Can't retain fragements that are nested in other fragments 02-13 11:42:43.258: E/AndroidRuntime(7167): at android.support.v4.app.Fragment.setRetainInstance(Fragment.java:742) 

4 Solutions collect form web for “No se pueden retener fragmentos anidados”

Puede utilizar FragmentManager.saveFragmentInstanceState(Fragment) para recuperar un estado de fragmento. El valor de retorno implementa Parcelable, por lo que puede ponerlo en un Bundle.

Para la restauración, puede proporcionar el estado después de crear el fragmento utilizando Fragment.setInitialSavedState(Fragment.SavedState) .

Desde la biblioteca de soporte 20+ ( https://code.google.com/p/android/issues/detail?id=74222 ), hay un error con la recreación de la instancia para los fragmentos secundarios, hay una corrección para ello – http: / /ideaventure.blogspot.com.au/2014/10/nested-retained-fragment-lost-state.html

Código de la página web (agregue esto a su Fragmento padre) –

 private FragmentManager childFragmentManager() {//!!!Use this instead of getFragmentManager, support library from 20+, has a bug that doesn't retain instance of nested fragments!!!! if(mRetainedChildFragmentManager == null) { mRetainedChildFragmentManager = getChildFragmentManager(); } return mRetainedChildFragmentManager; } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (mRetainedChildFragmentManager != null) { //restore the last retained child fragment manager to the new //created fragment try { Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager"); childFMField.setAccessible(true); childFMField.set(this, mRetainedChildFragmentManager); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } 

Problema: se está recreando mChildFrgamentManager ( https://code.google.com/p/android/issues/detail?id=74222 )
Solución: Retener mChildFrgamentManager si el fragmento tiene setRetainInstance(true) :

 @Override public void onAttach(Activity activity) { super.onAttach(activity); if (getRetainInstance()) { if (mRetainedChildFragmentManager != null) { try { Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager"); childFMField.setAccessible(true); childFMField.set(this, mRetainedChildFragmentManager); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else { mRetainedChildFragmentManager = getChildFragmentManager(); } } } 

Advertencia: Con este código, setRetainInstace debe llamarse antes onAttach .

PS: Esta es una versión un poco mejorada de la respuesta @attels.

Esto ya no es una limitación con la última biblioteca de soporte, después de este compromiso AOSP .

A continuación se muestra el mensaje de confirmación:

Permitir setRetainInstance (true) en fragmentos anidados

Guarde fragmentos arbitrariamente anidados a través de los cambios de configuración como objetos de no configuración. Esto permite el uso de fragmentos secundarios de retención-instancia como dependencias opacas arbitrarias dentro de otros fragmentos.

  • Objetos de comunicación entre fragmentos múltiples en ViewPager
  • Android Honeycomb: Fragmento no puede iniciar AsyncTask?
  • Reposición / margen de ViewPager de Android entre fragmentos de página
  • Cómo llamar a fragment method de la actividad principal
  • El botón onclick dentro del fragmento no funciona
  • Fragmento predeterminado del cajón de navegación
  • ¿Está teniendo un fragmento con cada actividad una buena práctica (basada en Android Studio)?
  • FragmentTransaction.replace () transición de fade-in muestra el fragmento "fantasma"
  • Fragmento dentro ScrollView da parpadeo de fondo negro
  • Memoria retenida por el fragmento
  • ¿Cómo puedo cambiar el tamaño de dos fragmentos en la pantalla por el enfoque?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.