Wie beibehalten fragment-Daten nach dem backstack Transaktionen?
Ich habe eine activity mit fragment 'Liste', die bei Klick auf eines seiner Elemente ersetzen wird selbst zu einer 'content' - fragment. Wenn der Benutzer die Schaltfläche zurück, er brachte auf die 'Liste' - fragment wieder.
Das problem ist, dass das fragment ist in seiner Standard-Zustand, egal was ich versuche, um die Persistenz der Daten.
Fakten:
- beide Fragmente entstehen durch
public static TheFragment newInstance(Bundle args)
,setArguments(args)
undBundle args = getArguments()
- beide Fragmente sind auf dem gleichen Niveau, die direkt in einer
FrameLayout
von der übergeordneten Aktivität (das heißt, nicht verschachtelten Fragmente) - Ich nicht nennen will
setRetainInstance
, denn meine Tätigkeit ist eine master/detail flow, hat eine 2 Bereich layout auf größeren Bildschirmen. 7" tablets haben 1 klicken Sie in der Porträt-und 2 Scheiben in der Landschaft. Wenn ich das behalten 'Liste' - fragment-Instanz, wird es (denke ich) ficken Dinge mit Bildschirm Rotationen - wenn der Benutzer auf ein Element klickt im 'list' - fragment, die 'content' - fragment ist dargestellt durch
FragmentTransaction#replace(int, Fragment, String)
mit der gleichen ID, aber einen anderen tag - Ich habe überschreiben
onSaveInstanceState(Bundle)
, aber das ist nicht immer aufgerufen vom framework, als pro doc: "Es gibt viele Situationen, in denen ein fragment werden kann, meist abgerissen (wie, wenn auf den Rücken gelegt stack ohne UI zu sehen), aber Ihr Zustand wird nicht gespeichert, bis Sie besitzenden Aktivität tatsächlich benötigt, um Ihren Zustand speichern." - Ich bin mit dem support library
Aus der Kugel 5 oben, ich denke, die low-end-Geräte, die benötigen, um wieder Speicher nach einem fragment Transaktion aufrufen kann Fragment#onSaveInstanceState(Bundle)
. Jedoch, auf meinem Test-Geräte (Galaxy Nexus und Nexus 7), wird der Rahmen nicht an der Methode. Also das ist keine gültige option.
So, wie kann ich behalten, fragment-Daten? das bundle übergeben Fragment#onCreate
, Fragment#onActivityCreated
usw. ist immer null
.
Daher kann ich nicht machen, einen Unterschied von einer Marke neues fragment starten Sie zu einem back stack wiederherstellen.
Hinweis: mögliche Verwandte/doppelte Frage
- Jetzt ist die einzige option die ich habe ist:
isFromBackStack = getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0
. Ich hätte gerne etwas sauberer, das fühlt sich an wie ein hack zu mir. Auch glaube ich nichtBundle
aus dem vorherigen fragment-Instanz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint dies nicht Recht, aber hier ist, wie ich am Ende dabei:
Und in das main-fragment:
Es funktioniert!
onDestroyView
onSaveInstanceState
setArguments
Alle Ereignisse sind abgedeckt, und die frischesten Informationen immer gehalten.
Ist es eigentlich komplizierter, es ist
interface
-Basis, der Hörer ist un/registriertonAttach
/onDetach
. Aber die Prinzipien sind die gleichen.fragment
ersetzt wird. Wissen Sie, ob diese möglicherweise alle Speicher Probleme?