Ich habe meine Android-App auf Honeycomb portiert und einen großen Refactor durchgeführt, um Fragmente zu verwenden. In meiner vorherigen Version habe ich beim Drücken der Home-Taste a ausgeführt, ACTIVITY_CLEAR_TOP
um den Backstack zurückzusetzen.
Jetzt ist meine App nur eine einzelne Aktivität mit mehreren Fragmenten. Wenn ich also die Home-Taste drücke, ersetze ich einfach eines der darin enthaltenen Fragmente. Wie kann ich meinen Backstack löschen, ohne ihn startActivity
mit der ACTIVITY_CLEAR_TOP
Flagge verwenden zu müssen?
android
android-fragments
Biquillo
quelle
quelle
Antworten:
Ich habe hier etwas Ähnliches gepostet
Aus Joachims Antwort, aus Dianne Hackborn:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Am Ende habe ich nur verwendet:
Hätte aber auch so etwas gebrauchen können:
Dadurch werden alle Zustände bis zu dem genannten angezeigt. Sie können das Fragment dann einfach durch das ersetzen, was Sie möchten
quelle
Um eine Antwort auf den Kommentar von @ Warpzit zu geben und anderen das Auffinden zu erleichtern.
Verwenden:
quelle
Bei allem Respekt gegenüber allen Beteiligten; Ich bin sehr überrascht zu sehen, wie viele von Ihnen den gesamten Fragment-Backstack mit einem einfachen löschen können
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Laut Android-Dokumentation (bezüglich des
name
Arguments - die "Null" in den beanspruchten Arbeitsvorschlägen).Jetzt ist mir klar, dass mir Kenntnisse über Ihre speziellen Implementierungen fehlen (z. B. wie viele Einträge Sie zu einem bestimmten Zeitpunkt im Backstack haben), aber ich würde mein ganzes Geld auf die akzeptierte Antwort setzen, wenn ich eine genau definierte Antwort erwarte Verhalten über eine größere Anzahl von Geräten und Anbietern:
(als Referenz etwas dazu)
quelle
Funktioniert für mich und auf einfache Weise ohne Schleife:
quelle
Akzeptierte Antwort war mir nicht genug. Ich musste verwenden:
quelle
popBackStackImmediate()
die Transaktion synchron ausgeführt wird, was im Allgemeinen nicht ratsam ist.Clear Backstack ohne Schleifen
Wobei Name der Parameter addToBackStack () ist
quelle
Ich wollte nur hinzufügen: -
Herausspringen aus dem Backstack mit folgenden Schritten
Es geht nur darum, die Fragmente aus der Transaktion zu entfernen. Auf keinen Fall wird das Fragment vom Bildschirm entfernt. Im Idealfall ist es für Sie möglicherweise nicht sichtbar, aber möglicherweise sind zwei oder drei Fragmente übereinander gestapelt, und beim Drücken der Zurück-Taste sieht die Benutzeroberfläche möglicherweise überladen und gestapelt aus.
Nehmen wir nur ein einfaches Beispiel: -
Angenommen, Sie haben ein FragmentA, das Fragmnet B mit fragmentmanager.replace () lädt, und dann fügen wir AddBoStack hinzu, um diese Transaktion zu speichern. Der Fluss ist also:
SCHRITT 1 -> FragmentA-> FragmentB (wir sind zu FragmentB übergegangen, aber Fragment A befindet sich im Hintergrund und ist nicht sichtbar).
Jetzt erledigen Sie einige Arbeiten in FragmentB und klicken auf die Schaltfläche Speichern. Nach dem Speichern sollte wieder zu FragmentA zurückkehren.
SCHRITT 2-> Beim Speichern von FragmentB kehren wir zu FragmentA zurück.
SCHRITT 3 -> Ein häufiger Fehler wäre also ... in Fragment B werden wir fragment Manager.replace () fragmentB mit fragmentA ausführen.
Aber was tatsächlich passiert, wir laden Fragment A erneut und ersetzen Fragment B. Jetzt gibt es also zwei FragmentA (eines aus STEP-1 und eines aus diesem STEP-3).
Zwei Instanzen von FragmentenA sind übereinander gestapelt, was möglicherweise nicht sichtbar ist, aber vorhanden ist.
Selbst wenn wir den Backstack mit den oben genannten Methoden löschen, wird die Transaktion gelöscht, nicht jedoch die tatsächlichen Fragmente. Idealerweise müssen Sie in einem solchen speziellen Fall beim Drücken der Schaltfläche Speichern einfach zu fragmentA zurückkehren, indem Sie einfach fm.popBackStack () oder fm.popBackImmediate () ausführen .
Also richtig Step3-> fm.popBackStack () gehe zurück zu fragmentA, das sich bereits im Speicher befindet.
quelle
Wenn Sie die Dokumentation lesen und die Fragment-ID untersuchen, scheint es sich lediglich um den Stapelindex zu handeln. Dies funktioniert also:
Null (
0
) ist die Unterseite des Stapels. Wenn Sie also einschließlich aufspringen, wird der Stapel gelöscht.CAVEAT: Obwohl das oben Genannte in meinem Programm funktioniert, zögere ich ein wenig, da in der FragmentManager-Dokumentation nie angegeben wird, dass die ID der Stapelindex ist. Es macht Sinn, dass es so wäre, und alle meine Debug-Protokolle zeigen, dass es so ist, aber vielleicht würde es unter bestimmten Umständen nicht so sein? Kann jemand dies auf die eine oder andere Weise bestätigen? Wenn dies der Fall ist, ist das Obige die beste Lösung. Wenn nicht, ist dies die Alternative:
quelle
fragmentManager..getBackStackEntryAt(0).getId()
anstelle von 0? Dies sollte auch dann funktionieren, wenn sich die Backstack-Eintrags-IDs irgendwann vom Stapelindex unterscheiden.Verwendung
quelle
Hallo ~ Ich habe eine Lösung gefunden, die viel besser ist: https://gist.github.com/ikew0ng/8297033
quelle
Ich habe das so gemacht:
quelle
Es funktioniert für mich, versuchen Sie dieses:
quelle
Der Aufruf dieser Methode wäre sehr ordentlich.
quelle
quelle