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 [1] > [2] > [3]
auf dem Rückweg navigieren kann (Drücken der Zurück-Taste) [3] > [1]
.
Wie ich mir vorgestellt hätte, würde dies dadurch erreicht, dass addToBackStack(..)
beim Erstellen der Transaktion, die das Fragment [2]
in den in XML definierten Fragmenthalter bringt, nicht aufgerufen wird.
Die Realität sieht so aus, als ob ich die Transaktion, die ein Fragment anzeigt , nicht aufrufen darf , wenn ich nicht [2]
wieder erscheinen möchte , wenn der Benutzer die Zurück-Taste drückt . Dies scheint völlig kontraintuitiv zu sein (möglicherweise aus der iOS-Welt).[3]
addToBackStack
[3]
Wie auch immer, wenn ich es so mache, wenn ich von [1] > [2]
zurück gehe und zurückdrücke, komme ich [1]
wie erwartet zurück.
Wenn ich gehe [1] > [2] > [3]
und dann zurück drücke, springe ich zurück zu [1]
(wie erwartet). Jetzt passiert das seltsame Verhalten, wenn ich versuche, noch [2]
einmal von zu springen [1]
. Zunächst [3]
wird kurz angezeigt, bevor es [2]
sichtbar wird. Wenn ich an dieser Stelle zurückdrücke, [3]
wird angezeigt, und wenn ich erneut zurückdrü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"
/>
Update Dies ist der Code, den ich zum Erstellen durch nav heirarchy verwende
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