FragmentManager popBackStack entfernt das Fragment nicht

8

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:

  1. Laden Sie einen Abschnitt, der setHasOptionsMenu (true) aufruft, auf onResume ()
  2. lädt einen anderen Abschnitt (alter Abschnitt, der aus dem Stapel entfernt werden soll). Ich sehe es OK. Es wird kein Menü angezeigt
  3. Verlasse die Anwendung (zB gehe zur Android Lauch-Aktivität) und wenn ich zurückkomme, sehe ich den richtigen Abschnitt, aber es zeigt das Menü des alten Fragments.

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.

    
edrian 06.05.2014, 15:43
quelle

5 Antworten

18

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.

    
edrian 06.05.2014, 17:15
quelle
6

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)

    
Malder 09.03.2015 15:44
quelle
4

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

auf

Für Ihre "ANMERKUNG 1": FragmentTransaction.replace wird Ihren Fragmentstatus nicht ändern.

    
Neige 06.05.2014 16:14
quelle
0

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, Ссылка

    
zIronManBox 06.05.2014 16:11
quelle
0

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.

    
Aviv Cohen 09.03.2018 13:34
quelle