Was sind die Unterschiede zw onCreate()
, onCreateView()
und onActivityCreated()
in Fragmenten und wofür würden sie jeweils verwendet werden?
Unterschied und Verwendung von onCreate(), onCreateView() und onActivityCreated() in Fragmenten
Farbod Salamat-Zadeh
AKTUALISIEREN:
onActivityCreated()
ist ab API-Level 28 veraltet.
onCreate():
Die onCreate()
Methode in a Fragment
ist genannt nach dem Activity
‘S onAttachFragment()
aber vorher Fragment
‘S onCreateView()
.
In dieser Methode können Sie Variablen zuweisen, get Intent
Extras und alles andere, was nicht die View-Hierarchie betrifft (dh nicht-grafische Initialisierungen). Dies liegt daran, dass diese Methode aufgerufen werden kann, wenn die Activity
‘S onCreate()
ist noch nicht abgeschlossen, daher kann der Versuch, hier auf die View-Hierarchie zuzugreifen, zu einem Absturz führen.
onCreateView():
Nach dem onCreate()
heißt (in der Fragment
), der Fragment
‘S onCreateView()
wird genannt. Sie können Ihre zuweisen View
Variablen und Führen Sie alle grafischen Initialisierungen durch. Es wird erwartet, dass Sie a zurückgeben View
von dieser Methode, und dies ist die Hauptansicht der Benutzeroberfläche, aber wenn Ihre Fragment
keine Layouts oder Grafiken verwendet, können Sie zurückkehren null
(passiert standardmäßig, wenn Sie nicht überschreiben).
onActivityCreated():
Wie der Name schon sagt, ist dies genannt nach dem Activity
‘S onCreate()
hat vervollständigt. Es heißt nach onCreateView()
, und wird hauptsächlich für abschließende Initialisierungen (z. B. das Ändern von UI-Elementen) verwendet. Das ist veraltet ab API-Level 28.
Um zusammenzufassen…
… sie alle heißen in der Fragment
werden aber zu unterschiedlichen Zeiten angerufen.
Die onCreate()
wird zuerst aufgerufen, um alle nicht-grafischen Initialisierungen durchzuführen. Als Nächstes können Sie beliebige zuweisen und deklarieren View
Variablen, die Sie verwenden möchten onCreateView()
. Danach verwenden onActivityCreated()
um alle abschließenden Initialisierungen durchzuführen, die Sie durchführen möchten, sobald alles abgeschlossen ist.
Wenn Sie die offizielle Android-Dokumentation anzeigen möchten, finden Sie sie hier:
Es gibt auch einige etwas andere, aber weniger entwickelte Fragen/Antworten hier auf Stack Overflow:
onCreate()
vsonCreateView()
onCreateView()
vsonActivityCreated()
-
Ich dachte, ich würde nicht grafische Initialisierungen bei onCreate() implementieren, damit sie nicht erneut aufgerufen werden, wenn der Bildschirm gedreht wird. Es stellt sich heraus, dass ich fragment.setRetainInstance(true) aufrufen muss, da sonst sowohl onCreate() als auch onCreateView() erneut aufgerufen werden, wenn der Bildschirm gedreht wird.
– Verdammtes Gemüse
13. Februar 2016 um 4:52 Uhr
-
Ist der Zugriff auf die Ansichtshierarchie in onCreateView() sicher?
– Codi
11. April 2016 um 6:23 Uhr
-
Allerdings wird onCreate() der Aktivität möglicherweise erst beendet, wenn onActivityCreated() ? Besteht die Möglichkeit eines Absturzes in onCreateView für den Zugriff auf die Ansichtshierarchie? Ich bin mir nicht sicher, was der Unterschied zwischen onCreateView() / onActivityCreated() ist
– Codi
11. April 2016 um 23:45 Uhr
-
Zu beachten ist (zumindest bei AppCompatActivity), dass bei der Neuerstellung der Aktivität (z. B. nachdem sie minimiert und beendet wurde) die Fragmente onCreate() aufgerufen werden, bevor die Aktivitäten onCreate() und super.onCreate() beendet sind. Dies kann ein Problem sein, wenn Sie etwas wie Dagger verwenden und auf etwas in der eingefügten übergeordneten Aktivität zugreifen müssen. Eine Lösung hierfür besteht darin, den Code in onActivityCreated() einzufügen, das immer aufgerufen wird, wenn onCreate() aufgerufen wird.
– Nikolaus
10. Juli 2017 um 0:06 Uhr
-
Ist es sicher anzunehmen, dass die Aktivität
onCreate
fertig ist, sobald dieonCreateView
seiner Fragmente heißt?– nullmn
31. Dezember 2019 um 16:48 Uhr
Für alle, die eine prägnante, bildhafte Antwort suchen:
https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/
Und,
-
Einverstanden. Comic Sans ist für solche Dinge notwendig
– Kartik Chugh
26. Januar 2018 um 3:19 Uhr
-
Es ist das erste Mal, dass ich 3 verschiedene Schriftarten im selben Diagramm sehe, und irgendwie fühlt sich mein Leben jetzt vollständig an.
– Gilsand
8. Februar 2019 um 13:10 Uhr
-
Wann genau könnte ein Fragment neu gestartet werden?
– Saurabh
14. Februar 2020 um 15:40 Uhr
-
Wie kommt es, dass das Fragment nicht neu erstellt wird, wenn sein Prozess tot ist? AFAIK, nur der Aufgabenstatus, der als Bündel erhalten bleibt, und die App neu erstellt wird, wird wieder in den Vordergrund geholt.
– stdout
29. Februar 2020 um 21:16 Uhr
onActivityCreated() – Veraltet
onActivityCreated()
ist jetzt als Fragmente veraltet Version 1.3.0-alpha02
Die Methode onActivityCreated() ist jetzt veraltet. Code, der die Ansicht des Fragments berührt, sollte in onViewCreated() (das unmittelbar vor onActivityCreated() aufgerufen wird) ausgeführt werden, und anderer Initialisierungscode sollte in onCreate() enthalten sein. Um einen Rückruf speziell dann zu erhalten, wenn der onCreate() der Aktivität abgeschlossen ist, sollte ein LifeCycleObserver im Lebenszyklus der Aktivität in onAttach() registriert und entfernt werden, sobald der onCreate()-Rückruf empfangen wird.
Detaillierte Informationen finden Sie Hier
Siehe auch: stackoverflow.com/questions/27227906/…
– Brad Larson
♦
18. September 2015 um 14:56 Uhr
@BradLarson Ich verstehe nicht, warum dies geschlossen wurde. Es hat sich als relativ beliebte Frage erwiesen und unterscheidet sich von dem in Ihrem Kommentar angegebenen Link. Diese Frage fragt nach dem Unterschied zwischen den drei verschiedenen Methoden und ihrem Vergleich miteinander, aber die Frage, die Sie in Ihrem Kommentar verlinkt haben, erwähnt nur zwei dieser Methoden.
– Farbod Salamat-Zadeh
18. September 2015 um 15:11 Uhr
@BradLarson Fair genug und gut entdeckt. Könnte ich jetzt, da ich ein Verständnis habe, keine Antwort schreiben, die die drei Methoden besser vergleicht, und auf die Links für zusätzliche Details verweisen?
– Farbod Salamat-Zadeh
18. September 2015 um 15:37 Uhr
@FarbodSalamat-Zadeh – Sicher. Ich habe die Frage erneut geöffnet, wenn Sie glauben, dass Sie eine bessere Antwort geben können. Ich wollte es einfach nicht unbeantwortet lassen, wenn ich konnte.
– Brad Larson
♦
18. September 2015 um 15:52 Uhr