Ich konvertiere eine App, um Fragmente mithilfe der Kompatibilitätsbibliothek zu verwenden. Derzeit habe ich eine Reihe von Aktivitäten (ABCD), die aneinander gekettet sind. D hat eine Schaltfläche 'OK', die beim Drücken der Anrufe beendet wird und dann durchsprudelt, onActivityResult()
um C und B zusätzlich zu zerstören.
Für meine Version vor Honycomb-Fragmenten ist jede Aktivität effektiv ein Wrapper für Fragmente Af Bf Cf Df. Alle Aktivitäten werden über startActivityForResult()
und onActivityResult()
innerhalb jedes der Fragmente gestartet, die gerne aufgerufen werden könnengetActivity().finish()
Das Problem, das ich habe, ist, dass ich in meiner Honeycomb-Version nur eine Aktivität habe, A, und Fragmente Bf, Cf, Df werden mit dem geladen FragmentManager
.
Was ich nicht verstehe, ist, was in Df zu tun ist, wenn 'OK' gedrückt wird, um die Fragmente Df, Cf und Bf zu entfernen?
Ich habe versucht, das Fragment vom Stapel zu entfernen, aber dies führte zu einer Ausnahme. onActivityResult()
ist nutzlos, weil ich das Fragment nicht mit geladen habe startActivityForResult()
.
Denke ich völlig falsch darüber nach? Sollte ich eine Art Listener implementieren, der entweder mit dem übergeordneten Fragment oder der Aktivität kommuniziert, um den Pop über den Transaktionsmanager auszuführen?
Antworten:
Schritt 1: Lassen Sie Df D sagen "yo! Wir haben den OK-Klick!" über den Aufruf einer Methode, entweder für die Aktivität selbst oder für eine von der Aktivität bereitgestellte Schnittstelleninstanz.
Schritt 2: Lassen Sie D die Fragmente über entfernen
FragmentManager
.Die Hosting-Aktivität (D) ist diejenige, die weiß, welche anderen Fragmente in der Aktivität enthalten sind (im Gegensatz zu anderen Aktivitäten). Daher sollten In-Fragment-Ereignisse, die sich auf den Fragment-Mix auswirken könnten, an die Aktivität weitergegeben werden, wodurch die entsprechenden Orchestrierungsschritte ausgeführt werden.
quelle
finish()
sollte ausreichen.onDestroy()
Ihrem Fragment eine Methode hinzu und prüfen Sie, ob sie aufgerufen wird.Obwohl dies möglicherweise nicht der beste Ansatz ist, funktioniert dies am besten mit der Support- / Kompatibilitätsbibliothek
oder
Andernfalls.
Außerdem können Sie den Backstack verwenden und einfügen. Beachten Sie jedoch, dass sich das Fragment möglicherweise nicht auf dem Backstack befindet (abhängig von der Fragmenttransaktion, die es dort erhalten hat ..) oder dass es möglicherweise nicht das letzte ist, das auf den Stapel gelangt ist, sodass durch das Aufspringen des Stapels das falsche entfernt werden kann ...
quelle
Sie können den folgenden Ansatz verwenden, es funktioniert gut:
quelle
popBackStack()
ist die einzige Lösung, die funktioniert, wenn Sie den Titel der Aktionsleiste nach dem Löschen des Fragments auf den vorherigen Status zurücksetzen möchten. Andernfalls müsste ich nicht die beiden hoch bewerteten Lösungen von stackoverflow.com/questions/13472258/… und diese Lösung hier kombinieren, um nach verschiedenen Anwendungsfällen immer den richtigen Titel in der Aktionsleiste festzulegen . wie Zurückdrücken, Löschen, Hinzufügen Ersetzen und so weiter.Sie sollten die Aktivität mit dem Hinzufügen und Entfernen von Fragmenten befassen, wie CommonsWare sagt, und einen Listener verwenden. Hier ist ein Beispiel:
quelle
In der Aktivität / AppCompatActivity:
und rufen Sie dann das Fragment auf:
oder wie in anderen Antworten angegeben, nennen Sie dies im Fragment:
quelle
Wenn Sie die neue Navigationskomponente verwenden, ist dies einfach
Es erledigt die gesamte FragmentTransaction für Sie.
quelle
Überprüfen Sie, ob Ihre Anforderungen von einem DialogFragment erfüllt werden. DialogFragment hat eine Entlassung () -Methode. Meiner Meinung nach viel sauberer.
quelle
Ich erstelle dafür eine einfache Methode
Dann platziere es in meiner ActivityUtils-Klasse
Es funktioniert super, viel Spaß!
quelle
OnCreate:
So verstecke ich das Fragment in Klickereignis 1
Zeigt es dann zurück in Ereignis 2
quelle
Wenn Sie vom vierten Fragment im Backstack-Verlauf zum ersten zurückkehren müssen, verwenden Sie Tags !!!
Wenn Sie das erste Fragment hinzufügen, sollten Sie Folgendes verwenden:
oder
Und wenn Sie die Fragmente B, C und D zeigen möchten, verwenden Sie Folgendes:
und andere Briefe ....
Um zu
Fragment
A zurückzukehren, rufen Sie einfach anpopBackStack(0, "A")
, ja, verwenden Sie das Flag, das Sie beim Hinzufügen angegeben haben, und beachten Sie, dass es dasselbe Flag im Befehl sein mussaddToBackStack()
, nicht das, das beim Ersetzen oder Hinzufügen des Befehls verwendet wird.Bitte ;)
quelle
So schließen Sie ein Fragment im selben Fragment
quelle
Warum nicht einfach:
getActivity (). finish ();
quelle