replace()
hace 2 cosas:
- Retire fragmento añadido actualmente (A) desde el contenedor (C) que se indica
- Añadir nuevo fragmento (B) al mismo recipiente
Estas 2 operaciones son lo que se guarda como un registro/transacción Backstack. Tenga en cuenta que el fragmento A permanece en estado created
, y su vista se destruye.
Ahora popBackStack()
invierte su última transacción que ha agregado a BackStack.
En este caso sería de 2 pasos:
- Quitar B de C
- Añadir A a C
Después de esto, el fragmento B se convierte en detached
, y si no impidió referencias a él, será basura recolectada.
Para responder la primera parte de su pregunta, no hay llamada onCreate()
, porque FragmentB se mantuvo en el estado created
. Y la respuesta a la segunda parte de la pregunta es un poco más larga.
En primer lugar, es importante comprender que en realidad no agrega Fragments
a Backstack, añada FragmentTransactions
. Entonces, cuando piensas que "reemplazas con el Fragmento B, agregando el Fragmento A a la pila posterior", realmente agregas toda esta operación a la retroinstalación, es decir reemplazo de A con B. Este reemplazo consta de 2 acciones: eliminar A y B. agregue B.
Luego, el siguiente paso es el estallido de la transacción que contiene este reemplazo. Entonces, no estás reventando FragmentA, estás invirtiendo "remove A, add B", que se revirtió es "remove B, add A".
Y luego paso final debería ser más claro - no hay B que FragmentManager es consciente de, por lo que cuando se agrega mediante la sustitución de A con B en su última etapa, B tiene que ir a través de sus primeros métodos de ciclo de vida - onAttach()
y onCreate()
.
El siguiente código ilustra lo que está sucediendo.
FragmentManager fm = getFragmentManager();
FragmentA fragmentA = new FragmentA();
FragmentB fragmentB = new FragmentB();
// 1. Show A
fm.beginTransaction()
.add(fragmentA, R.id.container)
.commit();
// 2. Replace A with B
// FragmentManager keeps reference to fragmentA;
// it stays attached and created; fragmentB goes
// through lifecycle methods onAttach(), onCreate()
// and so on.
fm.beginTransaction()
.replace(fragmentB, R.id.container)
.addToBackstack(null)
.commit();
// 2'. Alternative to replace() method
fm.beginTransaction()
.remove(fragmentA)
.add(fragmentB, R.id.container)
.addToBackstack(null)
.commit();
// 3. Reverse (2); Result - A is visible
// What happens:
// 1) fragmentB is removed from container, it is detached now;
// FragmentManager doesn't keep reference to it anymore
// 2) Instance of FragmentA is placed back in the container
// Now your Backstack is empty, FragmentManager is aware only
// of FragmentA instance
fm.popBackStack();
// 4. Show B
// Since fragmentB was detached, it goes through its early
// lifecycle methods: onAttach() and onCreate().
fm.beginTransaction()
.replace(fragmentB, R.id.container)
.addToBackstack(null)
.commit();
'getFragmentManager(). PopBackStackImmediate();' hizo el truco. Gracias. –
Sin embargo, ¿dónde pondría este método? En mi pestaña oyente? – rasen58
sin ver el código, es difícil de decir ... pero debe ir en la sección del código que se ejecuta cuando desea "cerrar" el fragmento actual y volver al fragmento anterior. – stuckless