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.

Todo esto funciona como se esperaba. Pero estoy consiguiendo este problema:

  1. Cargar una sección que llama setHasOptionsMenu (true) on onResume ()
  2. Carga otra sección (sección antigua que se supone para salir de la pila). Lo veo bien. No se muestra ningún menú
  3. 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.

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

  • Android: flujo maestro / detallado (panel dual) con 1 actividad
  • Cómo evitar agregar el mismo fragmento a la pila
  • BetterPickers sin una biblioteca de soporte
  • Android onBackStackChanged () no se llama
  • ¿Qué hace exactamente FragmentManager y FragmentTransaction exactamente?
  • GetSupportFragmentManager no compila en DialogFragment
  • FragmentManager reemplazar fragmentos sin llamar onPause () onDestroy () para el fragmento antiguo
  • Fragmento con ViewPager dentro de Fragmento y FragmentStatePagerAdapter resultados en Excepción (con ejemplo completo)
  • OnViewCreated - lugar equivocado para reemplazar el fragmento?
  • Comprobar si existe un fragmento y reutilizarlo
  • GetBackStackEntryCount () siempre devuelve 0 incluso después de agregar addToBackStack y executePendingTransactions ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.