¿Cómo puedo agregar la última instancia de fragmento en backstack (si no conozco la etiqueta y la identificación del fragmento)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
android
android-fragments
back-stack
Leem.fin
fuente
fuente
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
oFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
si no puedo acceder al fragmento a través de un método pop?La función devuelve el enlace al principio
Fragment
de la pila. Ejemplo de uso:fuente
Personalmente probé muchas de esas soluciones y terminé con esta solución de trabajo:
Agregue este método de utilidad que se utilizará varias veces a continuación para obtener la cantidad de fragmentos en su backstack:
Luego, cuando agregue / reemplace su fragmento usando el método FragmentTransaction, genere una etiqueta única para su fragmento (por ejemplo: usando la cantidad de fragmentos en su pila):
Finalmente, puede encontrar cualquiera de sus fragmentos en su backstack con este método:
Por lo tanto, puede obtener fácilmente el fragmento superior en su backstack llamando a:
¡Espero que esto ayude!
fuente
este método auxiliar obtiene un fragmento de la parte superior de la pila:
fuente
Kotlin
fuente
.lastOrNull()
en caso de quefragments
esté vacío.Hay una lista de fragmentos en fragmentMananger. Tenga en cuenta que eliminar un fragmento no reduce el tamaño de la lista (la entrada del fragmento simplemente se vuelve nula). Por tanto, una solución válida sería:
fuente
getFragments()
devuelve una colección abreviada de fragmentos. Quizás el último sea visible, pero no muchos otros.La respuesta dada por deepak goel no me funciona porque siempre obtengo nulo de
entry.getName()
;Lo que hago es establecer una etiqueta para el fragmento de esta manera:
Donde ft es mi transacción de fragmento y
FRAGMENT_TAG
es la etiqueta. Luego uso este código para obtener el fragmento:fuente
Solo tomé la respuesta (correcta) de @roghayeh hosseini y la hice en Kotlin para aquellos aquí en 2017 :)
* Esto debe llamarse desde dentro de una actividad.
Disfruta :)
fuente
puede utilizar getBackStackEntryAt () . Para saber cuántas entradas tiene la actividad en el backstack, puede usar getBackStackEntryCount ()
fuente
Agregaré algo a la respuesta de Deepak Goel ya que muchas personas, incluido yo, obtuvieron un valor nulo al usar su método. Aparentemente, para que la etiqueta funcione cuando agrega un fragmento al backstack, debería hacerlo así:
Necesita agregar la misma etiqueta dos veces.
Hubiera comentado pero no tengo 50 reputación.
fuente
Mantener su propia pila de vuelta:
myBackStack
. ComoAdd
fragmento delFragmentManager
, agréguelo tambiénmyBackStack
. EnonBackStackChanged()
pop a partir demyBackStack
cuando su longitud es mayor quegetBackStackEntryCount
.fuente
Parece que algo ha cambiado para mejor, porque el código a continuación funciona perfectamente para mí, pero no lo encontré en las respuestas ya proporcionadas.
Kotlin:
Java:
fuente
Si lo usa
addToBackStack()
, puede usar el siguiente código.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
fuente
En realidad, no se ha agregado el último fragmento a la pila porque puede agregar varios o fragmentos a la pila en una sola transacción o simplemente eliminar fragmentos sin agregar uno nuevo.
Si realmente desea tener una pila de fragmentos y poder acceder a un fragmento por su índice en la pila, será mejor que tenga una capa de abstracción sobre
FragmentManager
y su backstack. Así es como puede hacerlo:Ahora, en lugar de agregar y quitar fragmentos llamando
FragmentManager
directamente, se debe utilizarpush()
,replace()
ypop()
los métodos deFragmentStackManager
. Y podrá acceder al fragmento superior simplemente llamandostack.get(stack.size() - 1)
.Pero si te gustan los trucos, tengo otras formas de hacer cosas similares. Lo único que tengo que mencionar es que estos trucos funcionarán solo con fragmentos de soporte.
El primer truco es simplemente agregar todos los fragmentos activos al administrador de fragmentos. Si solo reemplaza los fragmentos uno por uno y los saca de la pila, este método devolverá el fragmento superior:
El segundo enfoque es event more hacky y le permite obtener todos los fragmentos agregados en la última transacción para la que
addToBackStack
se ha llamado:Tenga en cuenta que en este caso debe poner esta clase en el
android.support.v4.app
paquete.fuente
O simplemente puede agregar una etiqueta al agregar fragmentos correspondientes a su contenido y usar un campo String estático simple (también puede guardarlo en el paquete de instancia de actividad en el método onSaveInstanceState (Bundle)) para contener la última etiqueta de fragmento agregada y obtener este fragmento porTag () en cualquier momento que necesite ...
fuente
La respuesta más alta (Deepak Goel) no funcionó bien para mí. De alguna manera, la etiqueta no se agregó correctamente.
Terminé enviando el ID del fragmento a través del flujo (usando intenciones) y recuperándolo directamente del administrador de fragmentos.
fuente