Differenza e usi di onCreate (), onCreateView () e onActivityCreated () in frammenti


329

Quali sono le differenze tra onCreate(), onCreateView()e onActivityCreated()nei frammenti e per cosa dovrebbero essere usati?



@BradLarson Non capisco perché fosse stato chiuso. Si è rivelata una domanda relativamente popolare ed è diversa dal link indicato nel tuo commento. Questa domanda sta chiedendo la differenza tra i tre diversi metodi e come si confrontano tra loro, ma la domanda che hai collegato nel tuo commento menziona solo due di questi metodi.
Farbod Salamat-Zadeh,

@BradLarson Abbastanza giusto e ben individuato. Ora, anche se ho una comprensione, non posso scrivere una risposta che paragona meglio i tre metodi, facendo riferimento ai collegamenti per ulteriori dettagli?
Farbod Salamat-Zadeh,

2
@ FarbodSalamat-Zadeh - Sicuro. Ho riaperto la domanda, se pensi di poter fornire una risposta migliore. Non volevo lasciarlo seduto senza risposta se potevo.
Brad Larson

Risposte:


395

onCreate ():

Il onCreate()metodo in un Fragmentviene chiamato dopo la Activity'sonAttachFragment() , ma prima che Fragment' s onCreateView().
In questo metodo, è possibile assegnare variabili, ottenere Intentextra e qualsiasi altra cosa che non coinvolga la gerarchia di visualizzazione (ovvero inizializzazioni non grafiche). Questo è perché questo metodo può essere chiamato quando il Activity's onCreate()non è finito, e quindi cercando di accedere alla gerarchia vista qui può causare un crash.

onCreateView ():

Dopo il onCreate()si chiama (in Fragment), le Fragment's onCreateView()si chiama. È possibile assegnare le Viewvariabili ed eseguire qualsiasi inizializzazione grafica . Si prevede di restituire un Viewda questo metodo e questa è la vista principale dell'interfaccia utente, ma se Fragmentnon si utilizzano layout o grafica, è possibile restituire null(accade per impostazione predefinita se non si esegue l'override).

onActivityCreated ():

Come dice il nome, questo viene chiamato dopo che Activityè onCreate()stato completato . Viene chiamato dopo onCreateView()e viene utilizzato principalmente per le inizializzazioni finali (ad esempio, la modifica degli elementi dell'interfaccia utente).


Per riassumere ...
... sono tutti chiamati nel Fragmentma sono chiamati in momenti diversi.
La onCreate()si chiama prima, per fare qualsiasi Inizializzazioni non grafici. Successivamente, è possibile assegnare e dichiarare qualsiasi Viewvariabile in cui si desidera utilizzare onCreateView(). Successivamente, utilizzare onActivityCreated()per eseguire le inizializzazioni finali che si desidera eseguire una volta che tutto è stato completato.


Se vuoi visualizzare la documentazione ufficiale di Android, puoi trovarla qui:
- - -onCreate()
onCreateView()
onActivityCreated()

Ci sono anche alcune domande / risposte leggermente diverse, ma meno sviluppate qui su Stack Overflow:


6
Ho pensato di implementare inizializzazioni non grafiche su onCreate () in modo che non venissero richiamate nuovamente quando lo schermo viene ruotato. Si scopre che devo chiamare fragment.setRetainInstance (true) altrimenti entrambi onCreate () e onCreateView () vengono richiamati nuovamente quando lo schermo viene ruotato.
Damn Vegetables,

In onCreateView (), è sicuro accedere alla gerarchia delle viste?
Cody,

@Cody Credo di si - accedere alla gerarchia della vista è lo scopo esatto di onCreateView.
Farbod Salamat-Zadeh,

1
Tuttavia, onCreate () di attività potrebbe non essere completato fino a quando onActivityCreated ()? C'è qualche possibilità di arresto anomalo in onCreateView per l'accesso alla gerarchia delle viste? Non sono sicuro di quale sia la differenza tra onCreateView () / on onActivityCreated ()
Cody,

1
Una cosa da notare (almeno con AppCompatActivity) è che quando l'attività viene ricreata (ad es. Dopo essere stata minimizzata e uccisa), i frammenti di OnCreate () verranno chiamati prima che le attività onCreate () e super.onCreate () siano terminate. Questo può essere un problema se stai usando qualcosa come Dagger e hai bisogno di accedere a qualcosa nell'attività genitore che viene iniettata. Una soluzione a questo è quella di mettere il codice in onActivityCreated () che viene chiamato sempre chiamato di onCreate ().
Nicholas,

144

Per chiunque cerchi una risposta concisa e pittorica:

inserisci qui la descrizione dell'immagine https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


E,

inserisci qui la descrizione dell'immagine


21
Concordato. Comic Sans è necessario per cose come questa
Kartik Chugh,

1
È la prima volta che vedo 3 caratteri diversi nello stesso diagramma e in qualche modo la mia vita sembra completa ora.
Gil Sand,

Quando esattamente un frammento potrebbe riavviarsi?
Saurabh,

1
Come mai il frammento non viene ricreato una volta che il processo è morto? AFAIK, solo lo stato dell'attività conservato come un bundle ed è stato ricreato, l'app viene portata nuovamente in primo piano.
stdout

6

onActivityCreated () - Obsoleto

onActivityCreated()è ora obsoleto come Fragments Versione 1.3.0-alpha02

Il metodo onActivityCreated () è ora obsoleto. Il codice che tocca la vista del frammento dovrebbe essere eseguito in onViewCreated () (che viene chiamato immediatamente prima di onActivityCreated ()) e l'altro codice di inizializzazione dovrebbe essere in onCreate (). Per ricevere una richiamata specificamente quando l'attività onCreate () è completa, un LifeCycleObserver deve essere registrato sul ciclo di vita dell'attività in onAttach () e rimosso una volta ricevuta la richiamata onCreate ().

Informazioni dettagliate sono disponibili qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.