Ich implementiere Menü-Navigation mit Fragmenten. So beginne ich mit Home, und Benutzer können dann zu verschiedenen Abschnitten und Details der einzelnen Abschnitte navigieren.
Wenn ein Benutzer den Abschnitt ändert, rufe ich den Fragmentmanager-Backstack auf, bis ich Home erreiche, und lade dann den neuen Abschnitt.
Dies funktioniert alles wie erwartet. Aber ich bekomme dieses Problem:
Ich habe das Backstack iteriert und jedes Fragment gedruckt, und da ist es nicht das Fragment mit dem Menü.
Ich habe ein Debug-Zeichen auf die onResume () -Methode gesetzt (wo die setHasOptionsMenu(true)
markiert ist) und sie tritt tatsächlich hier ein, also ist das Fragment noch irgendwo.
Ich möchte wissen, ob ich etwas falsch mache und wie ich es lösen könnte, thx
Aktualisierung:
Ich verwende diesen Code, um neue Fragmente zu laden
%Vor%Und zum Entfernen:
%Vor%ANMERKUNG 1: Ich benutze stattdessen add, weil ich den Zustand meines Fragments nicht verlieren will, wenn ich vom Detailbereich zurück navigiere. Wenn ich einen anderen Abschnitt lade, rufe ich clearStack auf, um den Stapel auf 1 zu setzen, und lädt dann ein neues Fragment. Am Ende rufe ich executePendingTransactions () auf, um die Fragmente aus der Transaktion zu entfernen.
ANMERKUNG 2: Ich sehe, dass es in meine Fragment-onDestroy () -Methode eingeht, so dass es zerstört werden muss. Aber ich weiß nicht, warum es wieder aufgerufen wird, wenn die Hauptaktivität wieder aufgenommen wird.
Ich habe festgestellt, dass das Problem nicht in der Logik des Hinzufügens und Entfernens eines Fragments des Stapels liegt.
Das Problem war, dass ein Teil des Fragments weitere Fragmente darin geladen hat (es hatte ViewPager-Komponente). Dann dachte ich, dass, wenn das Fragment entfernt wurde, auch diese Fragmente entfernt wurden.
Dies gilt NUR, wenn Sie getChildFragmentManager()
method verwenden. Diese Methode MUSS verwendet werden, wenn Fragmente in andere Fragmente geladen werden. Wenn nicht, dann sind die Fragmente mit der Fragmentaktivität assoziiert.
Ich habe diese Frage gefunden, nachdem ich
aufgerufen habe %Vor% Dieser Code fragmentManager.getFragments().size()
liefert die maximale Anzahl von Fragmenten, die sich im Stapel befanden. Ich habe jedes Fragment auf Null überprüft. Und ich habe festgestellt, dass ein Fragment in meinem Fall null ist. Vielleicht wird es jemandem helfen)
popBackStack
wird nur Ihre letzte FragmentTransaction
wiederherstellen.
Wenn Sie FragmentTransaction.add
verwenden, ruft popBackStack
einfach FragmentTransacetion.remove
auf.
Wenn Sie jedoch FragmentTransaction.replace
aufrufen, ruft popBackStack
FragmentTransaction.remove
und FragmentTransaction.add
Für Ihre "ANMERKUNG 1":
FragmentTransaction.replace
wird Ihren Fragmentstatus nicht ändern.
Wenn Sie wirklich versuchen, Fragmente auf einmal zu entfernen, dann folgen Sie: Wie kann man Fragmente verschiedener Typen ersetzen?
Verwenden Sie andernfalls die Ersetzung-Transaktion für Fragmente, um den Übergang zu erleichtern und den Hassel-freien Ansatz zu verwenden, siehe Ссылка
Verstehen Sie auch den Fragmentlebenszyklus, Ссылка
Ich hatte ein ähnliches Problem, wo die popBackStack()
mein Fragment nicht entfernt hat.
Ich bemerkte jedoch, dass ich das falsche FragmentManager
aufgerufen habe, wo ich getSupportFragmentMananger()
anstelle von getFragmentManager()
aufrufen musste.
Tags und Links android android-fragments fragmentmanager android-nested-fragment