1) fragmentTransaction.addToBackStack(str);
Descripción : agregue esta transacción a la pila posterior. Esto significa que la transacción se recordará después de que se confirme y revertirá su operación cuando más tarde salga de la pila.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Descripción : reemplace un fragmento existente que se agregó a un contenedor. Esto es esencialmente lo mismo que llamar a remove (Fragment) para todos los fragmentos agregados actualmente que se agregaron con el mismo containerViewId y luego agregar (int, Fragment, String) con los mismos argumentos dados aquí.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Descripción : agregue un fragmento al estado de la actividad. Este fragmento opcionalmente también puede tener su vista (si Fragment.onCreateView devuelve no nulo) en una vista de contenedor de la actividad.
¿Qué significa reemplazar un fragmento ya existente, y agregar un fragmento al estado de actividad y agregar una actividad a la pila posterior?
Hay una pila en la que se mantienen todas las actividades en el estado de ejecución. Los fragmentos pertenecen a la actividad. Para que pueda agregarlos para incrustarlos en una actividad.
Puede combinar varios fragmentos en una sola actividad para crear una interfaz de usuario de múltiples paneles y reutilizar un fragmento en múltiples actividades. Esto es esencialmente útil cuando ha definido su contenedor de fragmentos en diferentes diseños. Solo necesita reemplazar con cualquier otro fragmento en cualquier diseño.
Cuando navega hasta el diseño actual, tiene la identificación de ese contenedor para reemplazarlo con el fragmento que desea.
También puede volver al fragmento anterior en el BackStack con el popBackStack()
método. Para eso necesitas agregar ese fragmento en la pila usando addToBackStack()
y luego commit()
para reflejar. Esto está en orden inverso con la corriente en la parte superior.
findFragmentByTag ¿busca esta etiqueta agregada por el método add / replace o el método addToBackStack?
Si depende de cómo agregaste la etiqueta. Luego, solo encuentra un fragmento por su etiqueta que definió antes, ya sea cuando se infla desde XML o como se proporciona cuando se agrega en una transacción.
Referencias: FragmentTransaction
Una diferencia más importante entre
add
yreplace
es esta:replace
elimina el fragmento existente y agrega un nuevo fragmento. Esto significa que cuando presiona el botón Atrás, el fragmento que se reemplazó se creará con suonCreateView
invocación. Mientras queadd
retiene los fragmentos existentes y agrega un nuevo fragmento que significa que el fragmento existente estará activo y no estará en estado 'en pausa', por lo tanto, cuando se presiona un botón de retrocesoonCreateView
no se llama al fragmento existente (el fragmento que estaba allí antes de que el nuevo fragmento fuera adicional).En cuanto a los eventos del ciclo de vida de los fragmentos
onPause
,onResume
,onCreateView
y otros eventos del ciclo de vida se invocarán en caso dereplace
que ellos no van invocarse en caso deadd
.Editar : Uno debe tener cuidado si está utilizando algún tipo de biblioteca de bus de eventos como el Eventbus de Greenrobot y reutilizando el mismo fragmento para apilar el fragmento encima de otro a través de
add
. En este escenario, aunque siga las mejores prácticas y registre el bus de eventosonResume
y se anule el registroonPause
, el bus de eventos aún estará activo en cada instancia del fragmento agregado, ya que eladd
fragmento no llamará a ninguno de estos métodos de ciclo de vida del fragmento. Como resultado, el oyente de bus de eventos en cada instancia activa del fragmento procesará el mismo evento que puede no ser lo que desea.fuente
Ejemplo, una actividad tiene 2 fragmentos y usamos
FragmentManager
para reemplazar / agregar conaddToBackstack
cada fragmento a un diseño en la actividadUsar reemplazar
Ir Fragmento1
Ir Fragmento2
Fragmento Pop2
Fragmento Pop1
Use agregar
Ir Fragmento1
Ir Fragmento2
Fragmento Pop2
Fragmento Pop1
Proyecto de muestra
fuente
onPause()
suponía que debía ser llamado antesonStop()
en cada acción Pop ?Aunque es una pregunta antigua que ya se ha respondido, tal vez los siguientes ejemplos puedan complementar la respuesta aceptada y pueden ser útiles para algunos programadores nuevos en Android como yo.
Opción 1 - "addToBackStack ()" nunca se usa
Caso 1A: agregar, eliminar y hacer clic en el botón Atrás
Caso 1B: agregar, reemplazar y hacer clic en el botón Atrás
Opción 2: siempre se usa "addToBackStack ()"
Caso 2A: agregar, eliminar y hacer clic en el botón Atrás
Caso 2B: agregar, reemplazar, eliminar y hacer clic en el botón Atrás
Opción 3: "addToBackStack ()" no se usa siempre (en los ejemplos a continuación, w / o indica que no se usa)
Caso 3A: agregar, eliminar y hacer clic en el botón Atrás
Caso 3B: agregar, reemplazar, eliminar y hacer clic en el botón Atrás
fuente
La diferencia básica entre
add()
yreplace()
se puede describir como:add()
se usa simplemente para agregar un fragmento a algún elemento raíz.replace()
se comporta de manera similar pero al principio elimina los fragmentos anteriores y luego agrega el siguiente fragmento.Podemos ver la diferencia exacta cuando la usamos
addToBackStack()
junto conadd()
oreplace()
.Cuando presionamos el botón de retroceso en caso de
add()
... onCreateView nunca se llama, pero en caso de quereplace()
, cuando presionamos el botón de retroceso ... se llama a oncreateView cada vez.fuente
Cuando agregamos el primer fragmento -> Segundo fragmento usando el método add ()
Cuando usamos add () en fragmento
Cuando usamos replace () en fragmento
ir al primer fragmento al segundo fragmento en Primero -> Segundo usando el método replace ()
En el caso de Reemplazar primer fragmento, este método se llama de forma adicional (onPause, onStop, onDestroyView se llama de forma adicional)
E / Keshav FirstFragment: onPause
E / Keshav FirstFragment: onStop
E / Keshav FirstFragment: onDestroyView
fuente
La función agregar y reemplazar del FragmentManger se puede describir como estos 1. agregar significa que agregará el fragmento en la pila de fragmentos y se mostrará en el marco dado que está proporcionando como
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2. reemplazar significa que está reemplazando el fragmento con otro fragmento en el marco dado
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
La utilidad principal entre los dos es que cuando vuelva a apilar, el reemplazo actualizará el fragmento pero agregar no actualizará el fragmento anterior.
fuente
Algo importante a tener en cuenta:
La diferencia entre Reemplazar y Reemplazar con backstack es cuando usamos solo replace, luego se destruye el fragmento (se llama a ondestroy ()) y cuando usamos replace con backstack, entonces no se llama a los fragmentos onDestroy () (es decir, cuando se presiona el botón Atrás, se invoca el fragmento con su onCreateView ())
fuente
Aquí hay una imagen que muestra la diferencia entre
add()
yreplace()
Por lo tanto, el
add()
método continúa agregando fragmentos sobre el fragmento anterior en FragmentContainer.Mientras que los
replace()
métodos borran todo el Fragmento anterior de los Contenedores y luego lo agregan en FragmentContainer.¿Qué es addToBackStack?
addtoBackStack
El método se puede usar con los métodos add () y replace. Tiene un propósito diferente en Fragment API.¿Cuál es el propósito?
Fragment API a diferencia de Activity API no viene con la navegación del botón Atrás de forma predeterminada. Si desea volver al Fragmento anterior, entonces usamos el método addToBackStack () en Fragmento. Entendamos ambos
Caso 1:
Caso 2:
fuente