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.
- Android - ¿Cómo realizar un seguimiento de la aplicación Sólo se reanuda cuando sale y vuelve a la aplicación?
- ¿Cómo quitar el foco del fragmento trasero de la pila?
- ¿Cómo reinicio una actividad en android?
- Ciclo de vida de la actividad de Android: ¿para qué sirven todos estos métodos?
- ViewPager con fragmentos - onPause (), onResume ()?
- El fragmento 1 es el fragmento más bajo, pero no en el backstack al establecer
disallowAddToBackStack
. - Fragmento 2 se inserta en la pila, utilizando
fragmentTransaction.addToBackStack()
. - Una nueva instancia del fragmento 1 se inserta en la pila.
- El fragmento más superior (fragmento 1) se extrae de la pila.
- La actividad 2 se convierte en primer plano.
- 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?
- Obtener parámetros de la intención utilizada para onResume ()
- Get onPause & onResume como eventos en el nivel de aplicación / tarea
- ¿Por qué onResume () se llama cuando se inicia una actividad?
- ¿Por qué onResume se llama cuando abro por primera vez la pestaña de un tabhost?
- Error en el administrador de descargas android
- Android: Actualizar ListView en la primera actividad al regresar de la segunda actividad
- OnResume Cámara Reinit Negro Pantalla
- La aplicación se bloquea cuando se reanuda
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.
- Detección de dispositivos en la red local
- ¿La lectura de la altitud del barómetro Android es incorrecta?