FragmentManager popBackStack no quita el fragmento
Estoy implementando la navegación de menú usando Fragmentos. Así que comienzo con Home, y luego los usuarios pueden navegar a diferentes secciones y detalles de cada sección.
Cuando un usuario cambia de sección, entonces llamo pop en la backstack de fragmentmanager hasta llegar a Home, y luego cargar la nueva sección.
- FragmentManager.getFragmens (). Size () no disminuyen después de FragmentTransaction.remove (Fragment)
- Comprobando si el estado se ha guardado antes de comprometer un FragmentTransaction
- java.lang.IllegalStateException (No se puede realizar esta acción después de onSaveInstanceState)
- ¿Cómo aplastar fragmentos en el backstack que coinciden con su etiqueta de fragmento?
- Cómo agregar / quitar Fragmento en el botón haga clic?
Todo esto funciona como se esperaba. Pero estoy consiguiendo este problema:
- Cargar una sección que llama setHasOptionsMenu (true) on onResume ()
- Carga otra sección (sección antigua que se supone para salir de la pila). Lo veo bien. No se muestra ningún menú
- Dejar la aplicación (por ejemplo, ir a Android Laucher actividad) y luego cuando vuelva, veo la sección correcta, pero está mostrando el menú del antiguo fragmento.
He iterado el backstack e impreso cada fragmento, y allí no es el fragmento con el menú.
Puse una marca de depuración en el método onResume () (donde el setHasOptionsMenu(true)
está marcado) y de hecho entra aquí, por lo que el Fragmento todavía está en algún lugar.
Quiero saber si estoy haciendo algo mal y cómo podría resolverlo, thx
Actualizar:
Estoy usando este código para cargar nuevos fragmentos
fm.beginTransaction() .add(container, sectionFragment.getFragment()) .addToBackStack(sectionFragment.getFragmentName()) .commit();
Y para quitar:
private void clearStack(){ int count = fm.getBackStackEntryCount(); while(count > 1){ fm.popBackStack(); count--; } }
NOTA 1: Estoy usando add en lugar de reemplazar porque no quiero perder el estado de mi fragmento cuando vuelvo de la sección de detalle. Cuando carga otra sección diferente, entonces llamo a clearStack para hacer estallar la pila hasta 1, y luego carga nuevo fragmento. Al final, estoy llamando a executePendingTransactions () para terminar de eliminar los fragmentos de la transacción.
NOTA 2: Estoy viendo que está entrando en mi método de fragment onDestroy (), por lo que se supone que se destruye. Pero no sé por qué se vuelve a llamar cuando se reanude la actividad principal.
- OnBackStackChanged () se llama dos veces cuando se agrega nuevo fragmento en backstack
- Android: remove () Fragmento -> add () nuevo Fragmento de la misma clase otra vez -> onCreateView y onActivityCreated no llamado?
- AppCompat v7: ¿Debo usar Framework FragmentManager o SupportFragmentManager?
- Android.support.v4.app.FragmentManager y android.app.FragmentManager en ViewPager
- Dónde llamar a getChildFragmentManager ()?
- Android FragmentManager BackStackRecord.run lanzando NullPointerException
- Android añadiendo Fragmento dentro de Fragmento
- Android.support.v4.app.FragmentManager O ¿android.app.FragmentManager?
Encontré que el problema no estaba en la lógica de agregar y de quitar el fragmento de la pila.
El problema era que parte del fragmento cargaba otros fragmentos dentro de él (tenía el componente ViewPager). Entonces pensé que cuando el fragmento fue removido, estos fragmentos también fueron eliminados.
Esto es cierto SOLO si utiliza el método getChildFragmentManager()
. Este método DEBE ser utilizado al cargar fragmentos dentro de otros fragmets. Si no, entonces los fragmentos están asociados con la actividad de los fragmentos.
He encontrado esta pregunta, porque después de llamar
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Este código fragmentManager.getFragments().size()
devuelve el número máximo de fragmentos mí, que estaban en la pila. Comprobé cada fragmento en nulo. Y encontré que algún fragmento es nulo en mi caso. Tal vez ayudará a alguien)
popBackStack
acaba de revertir su última FragmentTransaction
.
Si utiliza FragmentTransaction.add
, popBackStack
simplemente llamará a FragmentTransacetion.remove
.
Pero si llama a FragmentTransaction.replace
, popBackStack
llamará FragmentTransaction.remove
y FragmentTransaction.add
Para su "NOTA 1": FragmentTransaction.replace
no cambiará su estado de fragmento.
Si realmente está buscando eliminar fragmentos a la vez, siga estos pasos: ¿Cómo reemplazar fragmentos de diferentes tipos?
De lo contrario, sustituya la transacción por fragmentos para facilitar la transición y el enfoque sin complicaciones, consulte https://stackoverflow.com/a/23013075/3176433
También entienda el ciclo de vida de Fragment, http://developer.android.com/guide/components/fragments.html
- Obtener un ID de usuario de Google Play Services?
- ¿Cómo puedo obtener un MediaController de Android para que aparezca desde el layout xml?