android - studio - Diferencia entre add(), replace() y addToBackStack()
navegar entre fragments android studio (5)
¿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, y agregar un fragmento al estado de actividad, y agregar una actividad a la pila posterior?
En segundo lugar, con findFragmentByTag()
, ¿esta búsqueda de etiqueta agregada por el método add()
/ replace()
o el método addToBackStack()
?
Ejemplo: una actividad tiene 2 fragmentos y usamos FragmentManager
para reemplazar / agregar con addToBackstack
cada fragmento a un diseño en actividad
Usar reemplazar
Ir Fragmento 1
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume
Ir Fragment2
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume
Fragmento Pop2
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume
Fragmento Pop1
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Usar agregar
Ir Fragmento 1
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume
Ir Fragment2
Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume
Fragmento Pop2
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragmento Pop1
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
La diferencia básica entre add()
y replace()
se puede describir como:
-
add()
se usa simplemente para agregar un fragmento a un elemento raíz. -
replace()
comporta de manera similar, pero al principio elimina los fragmentos anteriores y luego agrega el siguiente fragmento.
Podemos ver la diferencia exacta cuando usamos addToBackStack()
junto con add()
o replace()
.
Cuando presionamos el botón Atrás después, en caso de add()
... nunca se llama onCreateView, pero en el caso de replace()
, cuando presionamos el botón Atrás ... se llama oncreateView cada vez.
Una diferencia más importante entre add
y replace
es: replace
elimina el fragmento existente y agrega un nuevo fragmento. Esto significa que cuando presiona el botón Atrás, se creará el fragmento que se reemplazó y se invoca su onCreateView. Mientras que add
retiene los fragmentos existentes y agrega un nuevo fragmento que significa que el fragmento existente estará activo y no estará en estado de "pausa", por lo tanto, cuando se presiona un botón Atrás, no se llama al fragmento existente (el fragmento que estaba antes de nuevo) fragmento fue añadido). En términos de los eventos del ciclo de vida del fragmento, se invocarán los eventos onPause, onResume, onCreateView y otros ciclos de vida en caso de replace
pero no se invocarán en caso de add
.
Edición : se debe tener cuidado si utiliza algún tipo de biblioteca de bus de eventos como el Eventbus de Greenrobot y reutiliza el mismo fragmento para apilar el fragmento sobre el otro a través de add
. En este escenario, aunque siga las mejores prácticas y registre el bus de eventos en onResume
y onResume
registro en onPause
, el bus de eventos todavía estará activo en cada instancia del fragmento agregado, ya que el fragmento de add
no llamará ninguno de estos métodos de ciclo de vida de fragmentos. Como resultado, la escucha del bus de eventos en cada instancia activa del fragmento procesará el mismo evento que puede no ser lo que usted desea.
add () ... se usa para agregar un fragmento a framelayout y usar a este disAdvantage es un fragmento anterior que puede mostrarse en el fondo
transaction.add(R.id.framelayout, fragment);
reemplazar () ... este es el uso para reemplazar el fragmento para el framelayout y el uso de esta ventaja es que el fragmento anterior no se puede mostrar en segundo plano, pero se almacena todo el fragmento
transaction.replace(R.id.framelayout, fragment);
addToBackStack () ... se usa para almacenar todo el fragmento en segundo plano y cuando el usuario puede presionar el botón Atrás y luego navegar al fragmento anterior
transaction.addToBackStack(null);
1) fragmentTransaction.addToBackStack(str);
Descripción - Agregue esta transacción a la pila trasera. Esto significa que la transacción se recordará después de que se confirme, y se revertirá su operación cuando se saque de la pila.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Descripción : reemplazar un fragmento existente que se agregó a un contenedor. Es esencialmente lo mismo que llamar a remove (Fragmento) para todos los fragmentos agregados actualmente que se agregaron con el mismo containerViewId y luego agregue (int, Fragmento, String) con los mismos argumentos que se dan aquí.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Descripción - Agregar un fragmento al estado de la actividad. Este fragmento también puede tener opcionalmente su vista (si Fragment.onCreateView devuelve un valor 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. Fragmentos pertenecen a la actividad. Así que puedes 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 varias actividades. Esto es esencialmente útil cuando ha definido su contenedor de fragmentos en diferentes diseños. Solo necesitas reemplazar con cualquier otro fragmento en cualquier diseño.
Cuando navega hasta el diseño actual, tiene el ID de ese contenedor para reemplazarlo con el fragmento que desea.
También puede volver al fragmento anterior en el backStack con el método popBackStack()
. 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 hace esta búsqueda para la etiqueta agregada por el método de agregar / reemplazar o el método addToBackStack?
Si depende de cómo se agrega la etiqueta. Luego simplemente encuentra un fragmento por su etiqueta que definió antes, ya sea cuando se infla de XML o como se suministra cuando se agrega en una transacción.
Referencias: FragmentTransaction