Wie behalte ich Fragmentdaten nach Backstack-Transaktionen?

8

Ich habe eine Aktivität, die die "Liste" des Fragments enthält, die sich beim Klicken auf eines ihrer Elemente durch ein "Inhaltsfragment" ersetzt. Wenn der Benutzer die Zurück-Schaltfläche verwendet, wird er erneut zum Fragment "Liste" gebracht.
Das Problem ist, dass das Fragment in seinem Standardzustand ist, egal was ich versuche, Daten zu erhalten.

Fakten:

  1. beide Fragmente werden durch public static TheFragment newInstance(Bundle args) , setArguments(args) und Bundle args = getArguments() erstellt
  2. Beide Fragmente befinden sich auf derselben Ebene, die sich direkt in einem FrameLayout von der übergeordneten Aktivität befindet (also keine verschachtelten Fragmente)
  3. Ich möchte setRetainInstance nicht aufrufen, weil meine Aktivität ein Master / Detail-Flow ist, der auf größeren Bildschirmen ein 2-Fenster-Layout hat. 7 "-Tabletts haben 1 Fenster im Hochformat und 2 Fenster im Querformat. Wenn ich die Fragmentinstanz 'list' behalte, wird es (glaube ich) Dinge mit Bildschirmdrehungen durcheinanderbringen
  4. Wenn die Benutzer auf ein Element im Fragment "list" klicken, wird das Fragment "content" durch FragmentTransaction#replace(int, Fragment, String) mit derselben ID, aber einem anderen Tag
  5. angezeigt
  6. Ich habe onSaveInstanceState(Bundle) überschrieben, aber das ist nicht immer , das vom Framework aufgerufen wird, wie nach dem Dokument : " Es gibt viele Situationen, in denen ein Fragment größtenteils abgerissen wird (z. B. wenn es auf dem Backstack platziert wird und keine Benutzeroberfläche angezeigt wird) ), aber sein Zustand wird nicht gespeichert, bis seine besitzende Aktivität seinen Zustand tatsächlich speichern muss. "
  7. Ich benutze die Support-Bibliothek

Aus dem obigen Punkt 5 geht hervor, dass Low-End-Geräte, die nach einer Fragmenttransaktion Speicher wiederherstellen müssen, Fragment#onSaveInstanceState(Bundle) aufrufen. Auf meinen Testgeräten (Galaxy Nexus und Nexus 7) ruft das Framework diese Methode jedoch nicht auf. Das ist also keine gültige Option.

Also, wie kann ich einige Fragmentdaten behalten? Das an Fragment#onCreate , Fragment#onActivityCreated usw. übergebene Paket ist immer null .

Daher kann ich keinen Unterschied zwischen einem brandneuen Start eines Fragments und einer Wiederherstellung im Backstack machen.

Hinweis: Möglich verwandte / doppelte Frage

    
Benoit Duffez 22.06.2013, 15:18
quelle

1 Antwort

9

Das scheint nicht richtig zu sein, aber hier habe ich es so gemacht:

%Vor%

Und im Hauptfragment:

%Vor%

Es funktioniert!

  • Wenn das Fragment aus dem Backstack stammt, verwendet es die in onDestroyView gespeicherten Parameter.
  • Wenn das Objekt von einer anderen App / einem anderen Prozess / aus dem Speicher zurück ist, wird das Fragment von onSaveInstanceState wiederhergestellt.
  • Wenn das Fragment zum ersten Mal erstellt wird, verwendet es die Parameter in setArguments

Alle Ereignisse werden abgedeckt und die neuesten Informationen werden immer gespeichert.

Es ist eigentlich komplizierter, es ist interface -based, der Listener ist von / co_de% / onAttach un / registriert. Aber die Prinzipien sind die gleichen.

    
Benoit Duffez 24.06.2013, 11:05
quelle