tutorial studio onattach navegar implement how fragments example entre ejemplo activity android android-fragments

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

Proyecto de muestra


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