Ho un enorme problema con il modo in cui sembra funzionare il backstack di frammenti Android e sarei molto grato per qualsiasi aiuto offerto.
Immagina di avere 3 frammenti
[1] [2] [3]
Voglio che l'utente sia in grado di navigare [1] > [2] > [3]
ma sulla via del ritorno (premendo il pulsante Indietro) [3] > [1]
.
Come avrei immaginato, ciò sarebbe stato ottenuto non chiamando addToBackStack(..)
durante la creazione della transazione che porta il frammento [2]
nel contenitore del frammento definito in XML.
La realtà di questo sembra che se non voglio [2]
apparire di nuovo quando l'utente preme il pulsante Indietro [3]
, non devo chiamare addToBackStack
la transazione che mostra frammento [3]
. Questo sembra del tutto controintuitivo (forse proveniente dal mondo iOS).
Ad ogni modo, se lo faccio in questo modo, quando vado da [1] > [2]
e premo indietro torno a [1]
come previsto.
Se vado [1] > [2] > [3]
e poi premo indietro, salto indietro [1]
(come previsto). Ora lo strano comportamento si verifica quando provo a saltare di [2]
nuovo da [1]
. Prima di tutto [3]
viene visualizzato brevemente prima che [2]
venga visualizzato. Se premo Indietro a questo punto [3]
viene visualizzato e se premo ancora una volta l'app esce.
Qualcuno può aiutarmi a capire cosa sta succedendo qui?
Ed ecco il file xml di layout per la mia attività principale:
<?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"
/>
Aggiorna Questo è il codice che sto usando per creare tramite la gerarchia nav
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]
Grazie molto