Probleme mit dem Android Fragment-Backstack

Ich habe ein massives Problem mit der Funktionsweise des Android-Fragment-Backstacks und wäre für jede angebotene Hilfe sehr dankbar.

Stellen Sie sich vor, Sie haben 3 Fragmente

[1] [2] [3]

Ich möchte, dass der Benutzer navigieren kann[1] > [2] > [3] aber auf dem Rückweg (Zurück-Taste drücken)[3] > [1].

Wie ich mir vorgestellt hätte, würde dies dadurch erreicht, dass ich nicht anrufeaddToBackStack(..) beim Erstellen der Transaktion, die Fragment bringt[2] in den in XML definierten Fragmenthalter.

Die Realität sieht so aus, als würde ich das nicht wollen[2] wird wieder angezeigt, wenn der Benutzer die Zurück-Taste drückt[3]Ich muss nicht anrufenaddToBackStack in der Transaktion, die Fragment zeigt[3]. Dies scheint völlig kontraintuitiv zu sein (möglicherweise aus der iOS-Welt).

Wie auch immer, wenn ich es so mache, wenn ich von hier aus gehe[1] > [2] und drücken Sie zurück, ich komme wieder an[1] wie erwartet.

Wenn ich gehe[1] > [2] > [3] und dann drücke ich springe zurück zu[1] (wie erwartet). Jetzt passiert das seltsame Verhalten, wenn ich versuche, zu springen[2] wieder aus[1]. Zuerst[3] wird vorher kurz angezeigt[2] kommt in Sicht. Wenn ich an dieser Stelle zurück drücke[3] wird angezeigt, und wenn ich erneut drücke, wird die App beendet.

Kann mir jemand helfen zu verstehen, was hier los ist?


Und hier ist die Layout-XML-Datei für meine Hauptaktivität:

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

        />



Aktualisieren Dies ist der Code, den ich verwende, um von der Navi-Hierarchie zu erstellen

    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]

Danke vielmals

Antworten auf die Frage(8)

Ihre Antwort auf die Frage