Momentan möchte ich bei Konfigurationsänderungen eine teure Datenstruktur beibehalten. Ich entscheide mich dafür, Bundle
nicht zu verwenden, da die teure Datenstruktur nicht parzellierbar ist.
Daher verwende ich ein Nicht-UI-Fragment (genannt RetainInstanceFragment ), dessen setRetainInstance(true)
die Datenstruktur enthält.
Ein UI-Fragment (genannt UIFragment ) erhält die teure Datenstruktur von RetainInstanceFragment
. Immer wenn Konfigurationsänderungen an UIFragment
vorgenommen werden, versucht UIFragment
immer, das "im Cache gespeicherte" RetainInstanceFragment
von FragmentManager
zu erhalten, bevor es beschließt, ein neues RetainInstanceFragment
zu erstellen.
Beispielcode ist wie folgt.
%Vor% Allerdings gibt es ein Problem. Immer wenn ich mein altes UIFragment
zerstöre und es durch neues UIFragment
ersetze, Ich erwarte, dass auch altes RetainInstanceFragment
zerstört wird. So zerstöre ich und erstelle neues UIFragment
Aber das alte RetainInstanceFragment
wird niemals zerstört.
Ich vermute, vielleicht vergesse ich, in UIFragment
aufzuräumen. Daher füge ich den folgenden Code hinzu
Es funktioniert jedoch nicht die ganze Zeit. Ich führe mehrere gleitende Menüklicks aus.
%Vor%Irgendeine Idee, wie ich zurückgehaltenes Instanzfragment richtig entfernen kann?
Wie von @Luksprog vorgeschlagen, funktioniert die folgende Methode. Es erklärt jedoch immer noch nicht, warum die vorherige Bereinigung durch onDetach
nicht funktioniert hat. Wenn jemand erklären kann, warum diese Lösung funktioniert und vorherige nicht, wäre ich sehr dankbar. :)
Die Fragmenttransaktionen werden nicht sofort ausgeführt. Meine Annahme war Die Ausführung dieser Transaktion im onDetach () - Callback wird nicht entfernt Die Retain-Fragment-Instanz vor dem Ersetzen des UI-Fragments Die Transaktion ist abgeschlossen und das neue UI-Fragment wird weiterhin angezeigt Behalte Fragment-Instanz noch verfügbar, so dass keine neue Instanz erstellt wird ein. Deine vorherige Methode ist nicht im Geiste der Fragmente Rahmen, in dem Fragmente anderer Fragmente und der Aktivität verwaltet alle von ihnen, da es mehr über das Ganze weiß Anwendungsstatus.
Ich denke, Sie können das Fragment einfach aus der Fragmenttransaktion entfernen.
%Vor%Tags und Links android