Diferencia y usos de onCreate (), onCreateView () y onActivityCreated () en fragmentos

329

¿Cuáles son las diferencias entre onCreate(), onCreateView()y onActivityCreated()en fragmentos y para qué se utilizarían?

Farbod Salamat-Zadeh
fuente
Ver también: stackoverflow.com/questions/27227906/…
Brad Larson
@BradLarson No entiendo por qué esto se había cerrado. Se ha demostrado que es una pregunta relativamente popular y es diferente al enlace indicado en su comentario. Esta pregunta pide la diferencia entre los tres métodos diferentes y cómo se comparan entre sí, pero la pregunta que vinculó en su comentario solo menciona dos de estos métodos.
Farbod Salamat-Zadeh
@BradLarson Bastante justo y bien visto. Ahora que tengo un entendimiento, ¿no podría escribir una respuesta que compare mejor los tres métodos, haciendo referencia a los enlaces para obtener detalles adicionales?
Farbod Salamat-Zadeh
2
@ FarbodSalamat-Zadeh - Claro. Reabrí la pregunta, si crees que puedes dar una mejor respuesta. Simplemente no quería dejarlo sentado sin respuesta si pudiera.
Brad Larson

Respuestas:

395

onCreate ():

El onCreate()método en a Fragmentse llama después de Activity'sonAttachFragment() pero antes de eso Fragment' s onCreateView().
En este método, puede asignar variables, obtener Intentextras y cualquier otra cosa que no implique la jerarquía de Vista (es decir, inicializaciones no gráficas). Esto se debe a que se puede llamar a este método cuando el Activity's onCreate()no está terminado, por lo que intentar acceder a la jerarquía de Vista aquí puede provocar un bloqueo.

onCreateView ():

Después de que onCreate()se llama a (en el Fragment), se llama a Fragment's onCreateView(). Puede asignar sus Viewvariables y hacer cualquier inicialización gráfica . Se espera que devuelva un Viewde este método, y esta es la vista principal de la interfaz de usuario, pero si Fragmentno utiliza ningún diseño o gráfico, puede regresar null(sucede de forma predeterminada si no anula).

onActivityCreated ():

Como su nombre lo indica, se llama después de que el Activity's se onCreate()haya completado . Se llama después onCreateView()y se usa principalmente para las inicializaciones finales (por ejemplo, modificación de elementos de la interfaz de usuario).


Para resumir ...
... todos se llaman en el Fragmentpero se llaman en diferentes momentos.
El onCreate()se llama en primer lugar, para hacer ningún inicializaciones no gráficas. A continuación, puede asignar y declarar cualquier Viewvariable que desee usar onCreateView(). Luego, use onActivityCreated()para hacer cualquier inicialización final que desee hacer una vez que todo se haya completado.


Si desea ver la documentación oficial de Android, puede encontrarla aquí:
- - -onCreate()
onCreateView()
onActivityCreated()

También hay algunas preguntas / respuestas ligeramente diferentes, pero menos desarrolladas aquí en Stack Overflow:

Farbod Salamat-Zadeh
fuente
66
Pensé que implementaría inicializaciones no gráficas en onCreate () para que no se vuelvan a llamar cuando se gira la pantalla. Resulta que tengo que llamar a fragment.setRetainInstance (true) de lo contrario, tanto onCreate () como onCreateView () se vuelven a llamar cuando se gira la pantalla.
Malditas verduras
En onCreateView (), ¿es seguro acceder a la jerarquía de vistas?
Cody
@Cody Creo que sí, acceder a la jerarquía de vistas es el propósito exacto de onCreateView.
Farbod Salamat-Zadeh
1
Sin embargo, ¿la actividad onCreate () podría no finalizar hasta que onActivityCreated ()? ¿Existe alguna posibilidad de bloqueo en onCreateView para acceder a la jerarquía de vistas? No estoy seguro de cuál es la diferencia entre onCreateView () / on onActivityCreated ()
Cody
1
Una cosa a tener en cuenta (al menos con AppCompatActivity) es que cuando se recrea la actividad (por ejemplo, después de ser minimizada y eliminada), se invocarán los fragmentos onCreate () antes de que finalicen las actividades onCreate () y super.onCreate (). Esto puede ser un problema si está usando algo como Dagger y necesita acceder a algo en la actividad principal que se inyecta. Una solución a esto es poner el código en onActivityCreated () que se llama siempre llamado de onCreate ().
Nicholas
144

Para cualquiera que busque una respuesta concisa y pictórica:

ingrese la descripción de la imagen aquí https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


Y,

ingrese la descripción de la imagen aquí

pulp_fiction
fuente
21
Convenido. Comic Sans es necesario para cosas como esta
Kartik Chugh
1
Es la primera vez que veo 3 fuentes diferentes en el mismo diagrama, y ​​de alguna manera mi vida se siente completa ahora.
Gil Sand
¿Cuándo exactamente podría reiniciarse un fragmento?
Saurabh
1
¿Cómo es que el fragmento no se vuelve a crear una vez que su proceso está muerto? AFAIK, solo el estado de la tarea se conserva como un paquete y se vuelve a crear, la aplicación vuelve a ponerse en primer plano.
stdout
6

onActivityCreated () - Desaprobado

onActivityCreated()ahora está en desuso como Fragments Version 1.3.0-alpha02

El método onActivityCreated () ahora está en desuso. El código que toca la vista del fragmento debe hacerse en onViewCreated () (que se llama inmediatamente antes de onActivityCreated ()) y otro código de inicialización debe estar en onCreate (). Para recibir una devolución de llamada específicamente cuando se completa onCreate () de la actividad, se debe registrar un LifeCycleObserver en el Ciclo de vida de la actividad en onAttach (), y eliminarlo una vez que se recibe la devolución de llamada onCreate ().

La información detallada se puede encontrar aquí

Gastón Saillén
fuente