Se reanuda el fragmento que no es el más alto en backstack

Dado el flujo de aplicación muestran en el gráfico y textualmente descrito en lo siguiente.

Flujo de la aplicación

  1. El fragmento 1 es el fragmento más bajo, pero no en el backstack al establecer disallowAddToBackStack .
  2. Fragmento 2 se inserta en la pila, utilizando fragmentTransaction.addToBackStack() .
  3. Una nueva instancia del fragmento 1 se inserta en la pila.
  4. El fragmento más superior (fragmento 1) se extrae de la pila.
  5. La actividad 2 se convierte en primer plano.
  6. La actividad 1 se convierte en primer plano.

Aquí está el método generalizado que utilizo para manejar fragmentos:

 private void changeContainerViewTo(int containerViewId, Fragment fragment, Activity activity, String backStackTag) { if (fragmentIsAlreadyPresent(containerViewId, fragment, activity)) { return; } final FragmentTransaction fragmentTransaction = activity.getFragmentManager().beginTransaction(); fragmentTransaction.replace(containerViewId, fragment); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if (backStackTag == null) { fragmentTransaction.disallowAddToBackStack(); } else { fragmentTransaction.addToBackStack(backStackTag); } fragmentTransaction.commit(); } 

Problema

Cuando la actividad 1 se reanuda en el último paso, la instancia más baja del fragmento 1 también se reanuda. En este momento el fragmento 1 devuelve null en getActivity() .

Pregunta

  • ¿Por qué se reanuda un fragmento que no es el máximo de la pila?
  • Si la reanudación del fragmento es correcta, ¿cómo debo manejar un fragmento separado?

Cuando una Activity no está mostrando UI y luego vienen a mostrar UI, el FragmentManager asociado está muriendo con todos sus fragmentos y necesita restaurar su estado.

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.

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 onRetoreInstanceState(Bundle inState){ myFragment = getFragmentManager().getFragment(inState, "myfragment"); } 

¡Pruebe esto y tenga suerte! Todos los derechos reservados

No veo cómo esto sucedería, a menos que (según cómo describas los pasos) no hayas entendido cómo funciona fragmentTransaction.addToBackStack (): administra las transacciones que se colocan en backstack, no fragmentos.

Desde los documentos Android:

Al llamar a addToBackStack (), la transacción de reemplazo se guarda en la pila posterior para que el usuario pueda revertir la transacción y recuperar el fragmento anterior presionando el botón Atrás.

Así que si su paso 2 se veía algo así en el código:

 fragmentTransaction.replace(containerViewId, fragment2); fragmentTransaction.addToBackStack(); fragmentTransaction.commit(); 

Y su paso 3:

 fragmentTransaction.disallowAddToBackStack()//or just no call to addToBackStack - you do not say fragmentTransaction.replace(containerViewId, newfragment1); fragmentTransaction.commit(); 

En este punto, Fragment2 será eliminado de la backstack, y su backstack consta de las dos instancias de Fragment1. En el paso 4, aparece el primero, lo que significa que debe tener el fragmento más pequeño ahora en la parte superior.

Esto explica por qué es el fragmento reanudado si regresa a la actividad. Pero no, me temo, por qué está aparentemente separado de su actividad.

Android OS puede y va a crear y destruir fragmentos cuando lo crea conveniente. Esto es probable que suceda cuando se inicia la actividad 2 y volver a la actividad 1. Comprobaría con seguridad que no es el fragmento que aparece activamente. Lo que probablemente está ocurriendo es que lo está viendo hacer algunos de los pasos de creación para el fragmento 1 antes de que haga los pasos de creación para el fragmento 2.

En cuanto a la manipulación de los fragmentos separados que debe echar un vistazo a esta página . La esencia de ello es que sólo debe estar utilizando el getActivity en ciertas funciones de fragmento (basado en el ciclo de vida del fragmento ). Esto podría significar que tienes que mover algo de tu lógica a otras funciones.

  • Android - guardar / restaurar estado de fragmento
  • Fragment onResume () no se llama cuando se utiliza FragmentPagerAdapter
  • Alternativa para el onResume () durante la conmutación de fragmentos
  • Actualizar Android ListView
  • Android: detención de actividad que no se reanuda
  • ¿El botón de retroceso de Android no reinicia la actividad?
  • Uso de onResume () para actualizar la actividad
  • Android: ejecuta el código onResume y onPause para todas las actividades de la aplicación?
  • Aplicación de Android / Actividad para empezar de nuevo Completamente cada vez que empieza o se reanuda?
  • ¿Cómo puedo saber que OnResume viene después de onCreate?
  • Fragmento onResume no llamado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.