Fragmento Android ve pérdida de estado al utilizar FragmentTransaction.replace ()

Estoy teniendo un problema bastante grande y no estoy muy entendiendo lo que está sucediendo. Estoy desarrollando una aplicación que utiliza Fragmentos (de la biblioteca de soporte) y estoy utilizando FragmentTransaction.replace() para colocar nuevos Fragmentos en la pila posterior y reemplazar el antiguo. El código se ve así:

 FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = ft.beginTransaction(); // Animations in my res/anim folder ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.fragment_container, newFragment, tag); ft.addToBackStack(null); ft.commit(); 

Esto es un éxito en la sustitución de mi fragmento. Mi problema es el siguiente. En un fragmento, tengo una lista de elementos que se construye a partir de la entrada del usuario. Ahora, cuando el usuario hace clic en Siguiente y luego hace clic en el botón Atrás (para volver a la lista), la lista está vacía porque la vista se destruye. Ahora, he observado lo siguiente:

  1. OnSaveInstanceState no se llama. Creo que esto es porque eso sólo se llama cuando la Actividad de los padres le dice a. Basado en los documentos: "Hay muchas situaciones en las que un fragmento puede ser mayormente 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 . ". Al parecer, realizar una sustitución en la FragmentTransaction no es uno de esos tiempos. ¿Alguien tiene confirmación sobre esto o una mejor explicación?
  2. SetOnRetainInstanceState (true) no es útil en esta situación. Una vez más, creo que esto tiene que ver con la información de los documentos: "Controlar si una instancia de fragmento se retiene a través de la recreación de actividad (como por ejemplo desde un cambio de configuración)". No estoy realizando ninguna acción en volver a crear la actividad así que esto no sirve de nada.

Por lo tanto, supongo que mi pregunta principal es: ¿hay una manera de preservar el estado de vista (simplemente mantener el fragmento) cuando se utiliza replace ? Hay FragmentTransaction.add() , pero hay algunos problemas con esto también. Una de ellas es que la animación de salida no se realiza, por lo que la animación no es correcta. Otra es que el nuevo fragmento que el antiguo fragmento (el que se está poniendo en un estado no visible) sigue siendo clicable. Por ejemplo, si tengo un ListFragment, y coloco un fragmento de contenido encima de eso usando add, todavía puedo hacer clic en los elementos de lista en el ListFragment.

Sin poder ver el código de tus fragmentos esto es un poco una suposición, pero en el pasado he corrido en este mismo problema y he encontrado que reajustar el adaptador en tu ListFragment en onViewStateRestored parece hacer el truco.

 public void onViewStateRestored (Bundle savedInstanceState) { super.onViewStateRestored (savedInstanceState); setListAdapter(new ArrayAdapter(Activity, R.layout.nav_item, objects)); } 

Lo que es extraño teniendo en cuenta que la documentación indica que este método se llama después onActivityCreated pero antes onStart . Pero parece que también se llama en otras ocasiones porque cuando se envía la transacción de fragmento más reciente de la pila trasera se llama a este método antes de que se muestre el fragmento previamente reemplazado. La actividad que posee los fragmentos no ha sido pausada u oscurecida de ninguna manera, por lo que de acuerdo con los documentos onViewStateRestored no se debe llamar ya que solo los fragmentos fueron modificados. Pero esto parece funcionar de todos modos.

Suena como si sólo necesita asegurarse de que ha implementado correctamente onCreateView y onDestroyView. La situación que está describiendo parece indicar que cuando se coloca el fragmento de lista en la pila trasera (como resultado de la transacción de reemplazo) Android está llamando a onDestroyView para liberar algunos recursos. Sin embargo, al parecer no ha destruido el fragmento de la lista, porque al pulsar de nuevo se está recuperando la misma instancia del fragmento.

Suponiendo que esto es cierto, entonces, cuando el usuario vuelve a llamar a Android llamará a CreateView. Cualquier estado que haya almacenado en las variables de instancia del fragmento debe estar allí y todo lo que necesita hacer es repoblar la vista … tal vez configurar el adaptador en el ListView o lo que sea.

También asegúrese de que su devolución de llamada onSaveInstanceState () realmente guarda cualquier estado de instancia que necesita para reconstruir la vista. De esta manera, si el fragmento realmente se destruye completamente, el FragmentManager puede restaurar el estado cuando necesita recrear el fragmento más tarde.

  • Android Lifecycle - ActivityManager mata proceso -> Excepción al volver de fondo
  • ¿Es onResume () llamado antes onActivityResult ()?
  • DialogFragment mostrado desde onContextItemSelected no sobrevive onPause / onResume
  • Una Actividad y todos los otros Fragmentos
  • Android: cuando usar onStart (), onStop ()?
  • OnCreateOptionsMenu en un ciclo de vida de Fragmento
  • Android: detención de actividad que no se reanuda
  • ¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación va al fondo?
  • Uso del servicio como singleton en Android
  • No se pudo resolver: android.arch.lifecycle: extensions: 1.0.0-alpha1 android studio 3.0
  • OnDestroy () - para establecer o no establecer variables de instancia a null?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.