2014-04-28 4 views
5

Ich habe eine Aktivität in meiner Android-App, die den Austausch mehrerer Ansichten/Fragmente behandelt. Diese Aktivität verfügt auch über eine Navigationsleiste, um zu Fragmenten auf oberster Ebene zu navigieren. Von den Fragmenten der obersten Ebene aus können Sie zu Fragmenten auf Detailebene navigieren.
Die Navigationsleiste ist immer zugänglich, indem Sie sie von der linken Seite her einschieben. Wenn das aktuelle Fragment ein Fragment der obersten Ebene ist, kann die Navigationsleiste auch über die Aktionsleiste aufgerufen werden. Wenn das aktuelle Fragment ein Fragment auf Detailebene ist, können Sie durch die Aktionsleiste (oder durch Drücken der Zurück-Schaltfläche) zurück navigieren.Backstack löschen und aktuelles Fragment durch ein Fragment auf oberster Ebene ersetzen

Sagen wir, ich habe 3 Fragmente der obersten Ebene, auf die über die Navigationsleiste zugegriffen werden kann.
fragment[1], fragment[2], fragment[3]

Von fragment[1], können Sie auf die Detail-Ebene fragment[1.1] navigieren.

Nun möchte der Benutzer direkt von der aktuellen fragment[1.1] zum obersten fragment[3] navigieren. Der Benutzer muss lediglich in die Navigationsleiste reinschieben und auf den Eintrag für fragment[3] klicken.
Nun, wenn der Benutzer die Zurück-Schaltfläche drückt, sollte die Anwendung schließen (weil es zu einem Fragment der obersten Ebene navigiert). Jedes Mal, wenn der Benutzer zu einem Fragment der obersten Ebene navigiert, sollte der Backstack daher gelöscht werden. Um zu überprüfen, ob ich den Schubladenindikator anzeigen soll, lese ich den getBackStackEntryCount() - Wert und vergleiche ihn mit 0.

Als Zusammenfassung. Ich möchte von Fragmenten auf Detailebene zu Fragmenten auf oberster Ebene navigieren und den Backstack beseitigen.

das Problem:
Wenn ich durch Ausführen
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);,
die Fragment Transaktionen die Backstack klar werden in umgekehrter wiederholt (zum Beispiel der Ersatz von fragment[1] durch fragment[1.1]). Und ich möchte nicht, dass sie wiederholt werden. Ich habe viele Initialisierungen in onCreateView, onViewCreated, onStart, .., auch Aufgaben zum Abrufen von Daten zu starten. Und ich möchte das alles überspringen. Ersetzen Sie einfach die Ansicht auf Detailebene durch eine neue Top-Level-Ansicht, die nicht bereits im Backstack enthalten war.

Ich konnte keine Lösung finden, um den Backstack ohne Popping-Transaktionen zu löschen.
Gibt es eine saubere Lösung für dieses Problem? Muss ich mein eigenes Backstack-Verhalten implementieren?

EDIT: Die YouTube App verhält sich auch so. Wenn Sie von Detail zu Top-Level navigieren, wird das Backstack gelöscht. Aber wie machen sie den Backstack frei, ohne die Fragmenttransaktionen wiederzugeben?

Vielen Dank für Ihre Antworten.

Antwort

1

Ich denke, das Problem ist, dass Sie Fragmente in einer Schleife knacken - ich denke. Normalerweise schiebe ich Fragmente auf den Fragmentstapel und gebe benutzerdefinierte Animationen an - sprich, schiebe ein neues Fragment von rechts ein und wenn du es platzierst, gleiten wir nach rechts. Jetzt - wenn Ihr Benutzer zu Fragment 1 dann 1.1 dann 1.2 usw. navigiert hat und Sie zurück zu 1 navigieren möchten, wenn ein Benutzer auf die Home-Schaltfläche in der Aktionsleiste klickt - geben Sie einen Namen für Ihre Fragment 1-Transaktion an. Die Sie, die Sie durchführen, verwenden diesen Namen. Ziehen Sie auch die Verwendung der popBackStack-Funktion anstelle von popBackStackImmediate in Betracht.