50 Stimmen

Wie kann man den Stapel für eine Aktivität mit mehreren Fragmenten zurückholen?

Activity layout picture

Nehmen wir an, ich habe eine Aktivität, die zwei FrameLayouts enthält (nennen wir sie FrameA und FrameB), die ihrerseits chaque ein Fragment enthalten (nennen wir sie jeweils FragmentA1 und FragmentB1). Nun übertrage ich eine Reihe von einzelnen Fragmenttransaktionen mit einem Code ähnlich dem folgenden...

getFragmentManager()
 .beginTransaction()
 .replace(frameId, fragment)
 .addToBackStack(null)
 .commit();

... so dass ich FragmentA1 in FrameA durch FragmentA2 ersetze, dann ersetze ich FragmentB1 in FrameB durch FragmentB2, dann ersetze ich FragmentA2 in FrameA durch FragmentA3, dann ersetze ich FragmentB2 in Frame2 durch FragmentB3, und der Endzustand sieht aus wie das Bild oben (wo nur FragmentA3 und FragmentB3 sichtbar sind).

Wenn ich richtig verstanden habe, wie der Rückwärtsstapel funktioniert, wird das Drücken von "Zurück" das Ploppen der Fragmente zwischen FrameA und FrameB verschachteln (so wie ich sie hinzugefügt habe).

Weiß jemand, ob es möglich ist, die letzte Transaktion auf FrameA oder FrameB selektiv zu löschen? (d.h. wenn ich "Pop FrameA" drücke, dann würde FrameA von FragmentA3 zu FragmentA2 zurückgeführt werden und wenn ich stattdessen "Pop FrameB" drücke, dann würde FrameB von FragmentB3 zu FragmentB2 zurückgeführt werden)

Nachtrag: Ich weiß, dass ich das zuletzt zu einem bestimmten FrameLayout hinzugefügte Fragment mit der FragmentManager.findFragmentById(int framelayoutId) Methode, aber der Aufruf von FragmentTransaction.remove(fragment).commit() entfernt nur das Fragment aus der Ansicht und führt die Ansicht nicht zu dem zuvor angezeigten Fragment zurück.

26voto

hackbod Punkte 89543

Grundsätzlich nein, es gibt nur einen Backstack für eine Aktivität.

Sie müssen lediglich Ihre eigenen separaten Backstacks einrichten.

Ab Android 4.0 (und der dazugehörigen Support-Bibliothek) gibt es APIs, die dies relativ einfach machen sollten. FragmentTransaction.detach(Fragment) können Sie ein Fragment in denselben Zustand versetzen, in dem es sich im Backstack befindet, und FragmentManager.saveFragmentInstanceState(Fragment) können Sie noch weiter gehen und das Fragment-Objekt komplett wegwerfen. Nicht zufällig werden diese verwendet, um die ViewPager's FragmentPagerAdapter bzw. FragmentStatePagerAdapter zu implementieren, so dass Sie sich den Code für diese als Beispiel für deren Verwendung ansehen können.

15voto

Hai-Yang Li Punkte 356
FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

Hier ist die einfachste Antwort, und die Erklärung ist sehr klar: Nun, es gibt einige Möglichkeiten, dies zu tun, je nach dem beabsichtigten Verhalten, aber dieser Link sollte Ihnen die besten Lösungen bieten und ist nicht überraschend von Dianne Hackborn...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X