Diferencia entre agregar(), reemplazar() y addToBackStack()
¿Cuál es la principal diferencia entre llamar a estos métodos?
fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
¿Qué significa reemplazar un fragmento ya existente, agregar un fragmento al estado de actividad y agregar una actividad a la pila de actividades?
En segundo lugar, con findFragmentByTag()
, ¿busca la etiqueta agregada por el método add()
/ replace()
o el addToBackStack()
método?
Una diferencia más importante entre add
y replace
es esta:
replace
elimina el fragmento existente y agrega un nuevo fragmento. Esto significa que cuando presione el botón Atrás, el fragmento que fue reemplazado se creará cuando onCreateView
se invoque. Mientras que add
conserva los fragmentos existentes y agrega un nuevo fragmento, eso significa que el fragmento existente estará activo y no estará en estado de "pausa", por lo que cuando se presiona el botón Atrás onCreateView
no se llama al fragmento existente (el fragmento que estaba allí antes de que se abriera el nuevo fragmento). agregado).
En términos de eventos del ciclo de vida del fragmento , onPause
y otros eventos del ciclo de vida se invocarán en caso de , pero no se invocarán en caso de .onResume
onCreateView
replace
add
Editar : Uno debe tener cuidado si está usando algún tipo de biblioteca de bus de eventos como Eventbus de Greenrobot y reutiliza el mismo fragmento para apilar el fragmento encima de otro vía add
. En este escenario, aunque siga las mejores prácticas y registre el bus de eventos onResume
y cancele el registro en onPause
, el bus de eventos seguirá activo en cada instancia del fragmento agregado, ya que add
el fragmento no llamará a ninguno de estos métodos del ciclo de vida del fragmento. Como resultado, el detector de bus de eventos en cada instancia activa del fragmento procesaría el mismo evento, que puede no ser lo que usted desea.
1) fragmentTransaction.addToBackStack(str);
Descripción : agregue esta transacción a la pila de actividades. Esto significa que la transacción se recordará después de confirmarse y revertirá su operación cuando luego se elimine de la pila.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Descripción : reemplaza 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 contenedorViewId y luego agregar(int, Fragment, String) con los mismos argumentos proporcionados aquí.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Descripción : agrega un fragmento al estado de actividad. Opcionalmente, este fragmento también puede tener su vista (si Fragment.onCreateView devuelve un valor no nulo) en una vista contenedora de la actividad.
¿Qué significa reemplazar un fragmento ya existente, agregar un fragmento al estado de actividad y agregar una actividad a la pila de actividades?
Hay una pila en la que se guardan todas las actividades en estado de ejecución. Los fragmentos pertenecen a la actividad. Entonces puedes agregarlos para incrustarlos en una actividad.
Puede combinar varios fragmentos en una sola actividad para crear una interfaz de usuario de varios paneles y reutilizar un fragmento en varias actividades. Esto es esencialmente útil cuando ha definido su contenedor de fragmentos en diferentes diseños. Sólo necesitas reemplazarlo con cualquier otro fragmento en cualquier diseño.
Cuando navega al diseño actual, tiene la identificación de ese contenedor para reemplazarlo con el fragmento que desea.
También puedes volver al fragmento anterior en backStack con el popBackStack()
método. Para eso necesitas agregar ese fragmento en la pila usando addToBackStack()
y luego commit()
reflejar. Esto está en orden inverso con la corriente arriba.
findFragmentByTag ¿busca esta etiqueta agregada mediante el método agregar/reemplazar o el método addToBackStack?
Depende de cómo agregaste la etiqueta. Luego simplemente encuentra un fragmento por su etiqueta que definiste antes, ya sea cuando se infla desde XML o como se proporciona cuando se agrega en una transacción.
Referencias: FragmentTransaction
Aquí hay una imagen que muestra la diferencia entre add()
yreplace()
Entonces, add()
el método continúa agregando fragmentos encima del fragmento anterior en FragmentContainer.
Mientras que replace()
los métodos borran todos los fragmentos anteriores de los contenedores y luego los agregan en FragmentContainer.
¿Qué es addToBackStack?
addtoBackStack
El método se puede utilizar con los métodos add() y replace. Tiene un propósito diferente en Fragment API.
¿Cuál es el propósito?
La API de fragmentos, a diferencia de la API de actividades, no viene con navegación con el botón Atrás de forma predeterminada. Si desea volver al Fragmento anterior, usamos el método addToBackStack() en Fragmento. entendamos ambos
Caso 1:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragmentContainer, fragment, "TAG")
.addToBackStack("TAG")
.commit();
Caso 2:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragmentContainer, fragment, "TAG")
.commit();
Por ejemplo, una actividad tiene 2 fragmentos y usamos FragmentManager
para reemplazar/agregar con addToBackstack
cada fragmento a un diseño en la actividad.
Usar reemplazar
Ir Fragmento1
Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume
Ir fragmento2
Fragment2: onAttach
Fragment2: onCreate
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume
Fragmento pop2
Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume
Fragmento pop1
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Usar agregar
Ir Fragmento1
Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume
Ir fragmento2
Fragment2: onAttach
Fragment2: onCreate
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume
Fragmento pop2
Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragmento pop1
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Proyecto de muestra