FragmentTransaction: Ersetzung und AddToBackStack arbeiten nicht zusammen?

8

Ich bin ziemlich neu in der Android-Entwicklung und laufe jetzt auf seltsames Verhalten ein.

  • Ich habe ein leeres FrameLayout als Container für ein Fragment.
  • Wenn der Benutzer zum ersten Mal eine Taste drückt, erzeuge ein neues Fragment und lege den Container hinein.
  • Wenn der Benutzer später auf eine Schaltfläche klickt und ein Fragment im Container vorhanden ist, ersetzen Sie den vorhandenen durch einen neu erstellten.
  • Wenn der Benutzer die Zurück-Taste drückt, blättert das Fragment im Container weg.

Hier ist mein Code

%Vor%

Wenn der Benutzer zum ersten Mal die Taste drückt, verhält es sich wie erwartet, füge ein neues Fragment zum Container hinzu. Aber wenn der Benutzer das zweite Mal die Taste drückt, während der Behälter noch ein Fragment enthält, wird anstelle eines Ersatzes ein neues hinzugefügt. Also, 2 Fragmente im Container, 2 zurück drücken, um alle Fragmente zu entfernen.

Ich habe festgestellt, dass wenn ich die Zeile entfernen

%Vor%

Und überarbeiten Sie die onBackPress () Methode wie folgt, es funktioniert wieder wie ich erwartet habe (1 Fragment in Container zu einem Zeitpunkt)

Im Grunde genommen entfernen Sie das Fragment manuell anstelle der popFromBackStack-Methode

%Vor%

Also, meine Frage ist

  • ersetzen und addToBackStack arbeitet nicht zusammen?
  • oder, habe ich etwas falsch gemacht?

Schätzen Sie alle Kommentare und Vorschläge.

    
Tar_Tw45 19.12.2013, 04:14
quelle

2 Antworten

13

addToBackstack erstellt eine Momentaufnahme Ihres Fragmentstatus. Das heißt, wenn Sie die Zurück-Taste drücken, kehren Sie tatsächlich zum letzten Zustand zurück, in dem addToBackstack aufgerufen wurde.

In Ihrem Fall fügen Sie ein Fragment hinzu. Der Zurück-Knopf würde dieses hinzugefügte Fragment entfernen. Wenn Sie replace aufrufen und erneut zum Backstack hinzufügen, haben Sie jetzt zwei Zustände auf dem Backstack (1. wenn Sie das erste Fragment hinzugefügt hatten, 2. wenn Sie keine Fragmente hinzugefügt hatten). Wenn Sie die Zurück-Schaltfläche verwenden, um das aktuelle Fragment zu entfernen, verwenden Sie nicht addToBackstack. Verwenden Sie nur addToBackstack, wenn Sie den Status von Fragmenten in einer Ansicht beibehalten möchten.

    
Spidy 19.12.2013, 04:43
quelle
-2

Für diejenigen, die noch nach einer Lösung suchen.

In der Hauptklasse Activity (die die Fragmente hostet) überschreiben Sie einfach onBackPressed() .

%Vor%

Es gibt keine onBackPressed() -Methode im Fragment, und diese Methode ist nur für activity . Wenn wir also die Zurück-Taste drücken, wird das Standardverhalten von activity angezeigt, welches

ist
  

Sie gehen entweder zur vorherigen Aktivität (falls vorhanden) oder zur App   wird beendet.

Jetzt müssen wir diese Methode überschreiben, um activity zu sagen, dass wenn wir die Back-Taste drücken, wenn Fragmente im Back-Stack sind, diese herauskommen (und das ist, wenn addToBackStack() ins Bild kommt). Andernfalls folgen Sie dem Standardverhalten.

Weitere Details finden Sie hier hier

    
KhogaEslam 17.11.2015 14:15
quelle