Tengo un gran problema con la forma en que parece funcionar el backstack de fragmentos de Android y agradecería cualquier ayuda que se ofrezca.
Imagina que tienes 3 fragmentos
[1] [2] [3]
Quiero que el usuario pueda navegar [1] > [2] > [3]
pero en el camino de regreso (presionando el botón Atrás) [3] > [1]
.
Como me hubiera imaginado, esto se lograría al no llamar addToBackStack(..)
al crear la transacción que trae un fragmento [2]
al titular del fragmento definido en XML.
La realidad de esto parece ser que si no quiero volver [2]
a aparecer cuando el usuario presiona el botón Atrás [3]
, no debo llamar addToBackStack
a la transacción que muestra un fragmento [3]
. Esto parece completamente contra-intuitivo (quizás proveniente del mundo de iOS).
De todos modos, si lo hago de esta manera, cuando salgo [1] > [2]
y presiono hacia atrás, regreso a[1]
lo esperado.
Si voy [1] > [2] > [3]
y luego presiono hacia atrás, salto de nuevo a [1]
(como se esperaba). Ahora el comportamiento extraño ocurre cuando intento saltar de [2]
nuevo [1]
. En primer lugar [3]
se muestra brevemente antes de que aparezca [2]
. Si presiono hacia atrás en este punto, [3]
se muestra, y si presiono hacia atrás una vez más, la aplicación se cierra.
¿Alguien puede ayudarme a entender qué está pasando aquí?
Y aquí está el archivo xml de diseño para mi actividad principal:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/headerFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
class="com.fragment_test.FragmentControls" >
<!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
android:id="@+id/detailFragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
/>
Actualización Este es el código que estoy usando para construir por jerarquía de navegación
Fragment frag;
FragmentTransaction transaction;
//Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
frag = new Fragment1();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2]
frag = new Fragment3();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//END OF SETUP CODE-------------------------
//NOW:
//Press back once and then issue the following code:
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Now press back again and you end up at fragment [3] not [1]
Muchas gracias