it-swarm.com.de

Gründe für die Verwendung von Fragment # setRetainInstance (Boolean)

Ich finde Fragment # setRetainInstance (true) verwirrend. Hier ist das Javadoc, extrahiert aus Android Developer API :

public void setRetainInstance (Boolesches Retain)

Steuern Sie, ob eine Fragmentinstanz während der Neuerstellung der Aktivität beibehalten wird (z. B. nach einer Konfigurationsänderung). Dies kann nur mit Fragmenten verwendet werden, die sich nicht im hinteren Stapel befinden. Wenn festgelegt, unterscheidet sich der Fragmentlebenszyklus geringfügig, wenn eine Aktivität neu erstellt wird:

  • onDestroy () wird nicht aufgerufen (onDetach () jedoch weiterhin, da das Fragment von seiner aktuellen Aktivität getrennt wird).
  • onCreate (Bundle) wird nicht aufgerufen, da das Fragment nicht neu erstellt wird.
  • onAttach (Activity) und onActivityCreated (Bundle) werden weiterhin aufgerufen.

Frage: Wie setzen Sie als Entwickler dies ein und warum macht es die Sache einfacher?

62
Håvard Geithus

Wie setzen Sie das als Entwickler ein?

Rufen Sie setRetainInstance(true) auf. Ich mache das normalerweise in onCreateView() oder onActivityCreated(), wo ich es benutze.

und warum macht es die Sache einfacher?

Es ist in der Regel einfacher als onRetainNonConfigurationInstance(), um die Beibehaltung von Daten über Konfigurationsänderungen hinweg zu handhaben (z. B. Drehen des Geräts von Hochformat zu Querformat). Nicht beibehaltene Fragmente werden beim Ändern der Konfiguration zerstört und neu erstellt. zurückgehaltene Fragmente sind es nicht. Daher sind alle Daten, die in diesen aufbewahrten Fragmenten enthalten sind, für die Aktivität nach der Konfigurationsänderung verfügbar.

80
CommonsWare

Es ist sehr hilfreich, um lang laufende Ressourcen wie Sockets offen zu halten. Verfügen Sie über ein UI-freies Fragment, das Verweise auf Bluetooth-Sockets enthält, und Sie müssen sich keine Sorgen mehr machen, wenn der Benutzer das Telefon umdreht.

Es ist auch praktisch, Verweise auf Ressourcen zu speichern, deren Laden viel Zeit in Anspruch nimmt, z. B. Bitmaps oder Serverdaten. Laden Sie es einmal, bewahren Sie es in einem beibehaltenen Fragment auf, und wenn die Aktivität erneut geladen wird, ist sie immer noch vorhanden und Sie müssen sie nicht neu erstellen.

45
DeeV

Fügte diese Antwort sehr spät hinzu, aber ich dachte, es würde die Dinge klarer machen. Sprich mir nach. Wenn setRetainInstance ist:

FALSE

  • Fragment wird bei Konfigurationsänderung neu erstellt. NEUE INSTANZ wird erstellt.
  • ALLE Lebenszyklusmethoden werden bei Konfigurationsänderungen aufgerufen, einschließlich onCreate () und onDestroy ().

TRUE

  • Fragment wird bei Konfigurationsänderung nicht neu erstellt. GLEICHE INSTANZ wird verwendet.
  • Alle Lebenszyklusmethoden werden bei Konfigurationsänderung aufgerufen, APART FROM onCreate () und onDestroy ().
  • Das Beibehalten einer Instanz funktioniert nicht, wenn sie zum Backstack hinzugefügt wird.

Vergessen Sie nicht, dass dies sowohl für DialogFragmente als auch für Fragmente gilt.

27
Eurig Jones