¿Cuál es el significado de addToBackStack con parámetro nulo?

94

Tengo un código de cliente. Solo hay una actividad para todos los fragmentos, es decir, la única actividad es gestionar todos los fragmentos.

Esta actividad contiene el siguiente código para cualquier fragmento al final del método de ese fragmento:

Por ejemplo, fragmentar MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Entonces,

1) ¿Cuál es el significado de addToBackStack(null)seguido de a commit()?

2) ¿Por qué necesita pasar un parámetro nulo a addToBackStack?

3) ¿Cómo obtener ese fragmento después de haber sido agregado así?

Parece que este código es inútil, ya que ejecuté el código sin la última línea .addToBackStack(null).commit()y se ejecutó sin problemas.

Dios mío
fuente
developer.android.com/reference/android/app/… en algunos casos debe llamar a ese método.
Lucifer
3
Puede pasar el nombre del fragmento como parámetro a addToBackStack (nombre) en lugar de Null. Si pasa Null, no podrá utilizar el método FragmentManager.popBackStackImmediate (String name, int flags); o popBackStack (nombre de cadena, banderas int); porque el nombre era Nulo. Entonces, los métodos popBackstack no funcionarán. Le sugiero que pase el nombre del fragmento como parámetros en lugar de pasar nulo.
Luckylukein

Respuestas:

112

¿Cuál es el significado de addToBackStack (nulo) seguido de un compromiso ()?

Citando documentos:

Al llamar a addToBackStack (), la transacción de reemplazo se guarda en la pila de actividades para que el usuario pueda revertir la transacción y recuperar el fragmento anterior presionando el botón Atrás.

Si agrega varios cambios a la transacción (como otro add () o remove ()) y llama a addToBackStack (), todos los cambios aplicados antes de llamar a commit () se agregan a la pila de actividades como una sola transacción y el botón Atrás los invertirá todos juntos.

No importa el orden en el que agregue los cambios a FragmentTransaction, excepto:

Debe llamar en commit()último lugar. Si agrega varios fragmentos al mismo contenedor, el orden en el que los agrega determina el orden en que aparecen en la jerarquía de vistas.

Así que tienes que comprometerte al final.

¿Por qué necesita pasar un parámetro nulo a addToBackStack?

No es necesario que sea nulo, puede ser una cadena. Si no lo desea, simplemente pase null.

resumen público FragmentTransaction addToBackStack (nombre de cadena)

Agregado en el nivel de API 11 Agregue esta transacción a la pila de actividades. 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.

Nombre de los parámetros Un nombre opcional para este estado de pila de actividades, o nulo.

Sobre:

Parece que este código es inútil ya que ejecuté el código sin la última línea .addToBackStack (null) .commit () y se ejecutó sin ningún problema

Si desea navegar al fragmento anterior, agréguelo al backstack. Por lo tanto, depende de si desea agregar el fragmento al backstack.

¿Cómo obtener ese fragmento después de haber sido agregado así?

Ya tienes la instancia del fragmento firstFragment. Así que no sé a qué te refieres con obtener el fragmento más tarde.

Más información @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)

Raghunandan
fuente
También puede agregar esto a su respuesta desde el documento API: Agregar esta transacción a la pila de actividades. 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. Nombre de los parámetros Un nombre opcional para este estado de la pila de actividades, o nulo.
Dyrborg
Entonces, según entendí, el propósito de agregar a backstack es realizar la navegación como lo hacemos con el botón Atrás para ir al fragmento anterior.
Dios mío
ok, entonces si está pasando un parámetro a addToBackStack, ¿por qué tenemos que hacerlo getFragmentManager().popBackStackImmediate()si el botón Atrás puede hacerlo solo con / sin el paso de parámetro? Vea la respuesta de - stackoverflow.com/questions/21156153/…
My God
@VedPrakash no es necesario. Además, esa es una pregunta y una respuesta diferentes. Puede descubrirlo fácilmente si tiene dos fragmentos agregándolos a la pila de actividades y presionando el botón Atrás
Raghunandan
@VedPrakash leyó la gestión de fragmentos @ developer.android.com/guide/components/fragments.html
Raghunandan
17

La tagcadena addToBackStack(String name)da una forma de ubicar la pila de respaldo para luego ir directamente a esa ubicación. Estaba destinado a ser utilizado en el método popToBackStack(String name, int flags):

Saque la última transición de fragmentos de la pila de fragmentos del administrador. Esta función es asincrónica: pone en cola la solicitud para que aparezca, pero la acción no se realizará hasta que la aplicación vuelva a su bucle de eventos.

nombre: si no es nulo, este es el nombre de un estado anterior anterior a buscar; si se encuentra, se mostrarán todos los estados hasta ese estado. La bandera POP_BACK_STACK_INCLUSIVE se puede usar para controlar si el estado nombrado en sí mismo se abre. Si es nulo, solo se muestra el estado superior.

banderas: 0 o POP_BACK_STACK_INCLUSIVE.

En otras palabras, abrirá su back stack hasta que encuentre el fragmento que fue agregado por namein addToBackStack(String name).

Por ejemplo, si realiza una serie de adiciones o reemplazos al administrador de fragmentos dando los nombres "frag1", "frag2", "frag3", "frag4" y luego desea volver directamente al fragmento 2 agregado con addToBackStack (" frag2 "), llamas popToBackStack("frag2", 0).

Entonces,

  • Utilice .addToBackStack("fragName"): si desea que más tarde popToBackStack(String name, int flags)saque más de una pila.

  • Uso .addToBackStack(null): Si no quieres que aparezcan más de una pila posterior más tarde, pero aún así quieres sacar una a la vez. Haga esto incluso si no llama explícitamente a popToBackStack (), sino que deja que la implementación predeterminada de back press maneje la pila de actividades.

  • Uso .disallowAddToBackStack(): Si no desea la tecla de retroceso, presione o llame a popBackStack () explícitamente. Se asegurará de que ninguna parte del código esté usando .addToBackStack ().

Allan Veloso
fuente
1

Tus respuestas están desaprobadas. Si no desea agregar fragmentos a la pila de actividades, debe usar el siguiente fragmento de código:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

A continuación tienes un lindo ejemplo de cómo usarlo:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
fuente
6
¿Dónde está obsoleto? No veo nada en la documentación o en la fuente FragmentTransaction.
Rup
3
Tenga cuidado, si es así disallowAddToBackStack, cualquier llamada futura a addToBackStack arrojará IllegalStateException. Si ya se ha llamado a addToBackStack, este método arrojará IllegalStateException.
Kathir