Différence et utilisations de onCreate (), onCreateView () et onActivityCreated () en fragments

329

Quelles sont les différences entre onCreate(), onCreateView()et onActivityCreated()en fragments et à quoi serviraient-ils chacun?

Farbod Salamat-Zadeh
la source
@BradLarson Je ne comprends pas pourquoi cela a été fermé. Il s'est avéré être une question relativement populaire et diffère du lien indiqué dans votre commentaire. Cette question demande la différence entre les trois méthodes différentes et la façon dont elles se comparent, mais la question que vous avez liée dans votre commentaire ne mentionne que deux de ces méthodes.
Farbod Salamat-Zadeh
@BradLarson Assez juste et bien repéré. Maintenant que j'ai une compréhension, ne pourrais-je pas écrire une réponse qui compare mieux les trois méthodes, référençant les liens pour plus de détails?
Farbod Salamat-Zadeh
2
@ FarbodSalamat-Zadeh - Bien sûr. J'ai rouvert la question, si vous pensez pouvoir apporter une meilleure réponse. Je ne voulais tout simplement pas le laisser sans réponse si je le pouvais.
Brad Larson

Réponses:

395

onCreate ():

La onCreate()méthode dans a Fragmentest appelée après le Activity'sonAttachFragment() mais avant celui Fragment-ci onCreateView().
Dans cette méthode, vous pouvez affecter des variables, obtenir des Intentextras et tout ce qui n'implique pas la hiérarchie View (c'est-à-dire les initialisations non graphiques). Cela est dû au fait que cette méthode peut être appelée lorsque le Activity's onCreate()n'est pas terminé, et donc essayer d'accéder à la hiérarchie View ici peut entraîner un plantage.

onCreateView ():

Après que le onCreate()est appelé (dans le Fragment), le Fragment's onCreateView()est appelé. Vous pouvez affecter vos Viewvariables et effectuer toutes les initialisations graphiques . Vous êtes censé renvoyer un Viewde cette méthode, et c'est la vue principale de l'interface utilisateur, mais si votre Fragmentn'utilise pas de mises en page ou de graphiques, vous pouvez retourner null(se produit par défaut si vous ne remplacez pas).

onActivityCreated ():

Comme son nom l'indique, cela est appelé une fois le Activity's onCreate()terminé . Il est appelé après onCreateView()et est principalement utilisé pour les initialisations finales (par exemple, pour modifier des éléments d'interface utilisateur).


Pour résumer ...
... ils sont tous appelés dans le Fragmentmais sont appelés à des moments différents.
Le onCreate()est appelé en premier, pour effectuer toutes les initialisations non graphiques. Ensuite, vous pouvez affecter et déclarer toutes les Viewvariables que vous souhaitez utiliser onCreateView(). Ensuite, utilisez onActivityCreated()pour effectuer les initialisations finales que vous souhaitez effectuer une fois que tout est terminé.


Si vous souhaitez consulter la documentation officielle d'Android, vous pouvez la trouver ici:
- - -onCreate()
onCreateView()
onActivityCreated()

Il y a aussi des questions / réponses légèrement différentes, mais moins développées ici sur Stack Overflow:

Farbod Salamat-Zadeh
la source
6
Je pensais que j'implémenterais des initialisations non graphiques à onCreate () afin qu'elles ne soient plus appelées lorsque l'écran est tourné. Il s'avère que je dois appeler fragment.setRetainInstance (true) sinon onCreate () et onCreateView () sont à nouveau appelés lorsque l'écran tourne.
Damn Vegetables
Dans onCreateView (), est-il sûr d'accéder à la hiérarchie des vues?
Cody
@Cody Je le crois - accéder à la hiérarchie des vues est le but exact de onCreateView.
Farbod Salamat-Zadeh
1
Cependant, onCreate () de l'activité peut ne pas se terminer avant onActivityCreated ()? Y a-t-il une chance de planter dans onCreateView pour accéder à la hiérarchie des vues? Je ne sais pas quelle est la différence entre onCreateView () / on onActivityCreated ()
Cody
1
Une chose à noter (au moins avec AppCompatActivity) est que lorsque l'activité est recréée (par exemple après avoir été minimisée et tuée), les fragments onCreate () seront appelés avant que les activités onCreate () et super.onCreate () ne soient terminées. Cela peut être un problème si vous utilisez quelque chose comme Dagger et devez accéder à quelque chose dans l'activité parent qui est injectée. Une solution à cela est de mettre le code dans onActivityCreated () qui est appelé toujours appelé de onCreate () est appelé.
Nicholas
144

Pour tous ceux qui recherchent une réponse concise et imagée:

entrez la description de l'image ici https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


Et,

entrez la description de l'image ici

Pulp Fiction
la source
21
D'accord. Comic Sans est nécessaire pour des choses comme ça
Kartik Chugh
1
C'est la première fois que je vois 3 polices différentes dans le même diagramme, et ma vie semble maintenant terminée.
Gil Sand
Quand exactement un fragment pourrait-il redémarrer?
Saurabh
1
Comment se fait-il que le fragment ne soit pas recréé une fois son processus terminé? AFAIK, seul l'état de la tâche est conservé en tant qu'ensemble et il est recréé, l'application est à nouveau mise au premier plan.
stdout
6

onActivityCreated () - Obsolète

onActivityCreated()est désormais déconseillé en tant que Fragments Version 1.3.0-alpha02

La méthode onActivityCreated () est désormais obsolète. Le code touchant la vue du fragment doit être fait dans onViewCreated () (qui est appelé immédiatement avant onActivityCreated ()) et tout autre code d'initialisation doit être dans onCreate (). Pour recevoir un rappel spécifiquement lorsque l'activité onCreate () est terminée, un LifeCycleObserver doit être enregistré sur le cycle de vie de l'activité dans onAttach () et supprimé une fois le rappel onCreate () reçu.

Des informations détaillées peuvent être trouvées ici

Gastón Saillén
la source