Diferencia entre agregar(), reemplazar() y addToBackStack()

Resuelto AndroidDev asked hace 54 años • 9 respuestas

¿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?

AndroidDev avatar Jan 01 '70 08:01 AndroidDev
Aceptado

Una diferencia más importante entre addy replacees esta:

replaceelimina 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 onCreateViewse invoque. Mientras que addconserva 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 onCreateViewno 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 , onPausey otros eventos del ciclo de vida se invocarán en caso de , pero no se invocarán en caso de .onResumeonCreateViewreplaceadd

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 onResumey cancele el registro en onPause, el bus de eventos seguirá activo en cada instancia del fragmento agregado, ya que addel 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.

Jeevan avatar Feb 10 '2014 17:02 Jeevan

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

sjain avatar Sep 05 '2013 10:09 sjain

Aquí hay una imagen que muestra la diferencia entre add()yreplace()

ingrese la descripción de la imagen aquí

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?

addtoBackStackEl 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();

ingrese la descripción de la imagen aquí

Caso 2:

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .commit();

ingrese la descripción de la imagen aquí

Rohit Singh avatar Jun 13 '2020 01:06 Rohit Singh

Por ejemplo, una actividad tiene 2 fragmentos y usamos FragmentManagerpara reemplazar/agregar con addToBackstackcada 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

Linh avatar Jan 05 '2018 03:01 Linh