Diferença e usos de onCreate (), onCreateView () e onActivityCreated () em fragmentos

329

Quais são as diferenças entre onCreate(), onCreateView()e onActivityCreated()nos fragmentos e para que cada um deles seria usado?

Farbod Salamat-Zadeh
fonte
Veja também: stackoverflow.com/questions/27227906/…
Brad Larson
@ BradLarson Não entendo por que isso foi encerrado. Provou ser uma pergunta relativamente popular e é diferente do link indicado no seu comentário. Esta pergunta está pedindo a diferença entre os três métodos diferentes e como eles se comparam, mas a pergunta que você vinculou no seu comentário menciona apenas dois desses métodos.
Farbod Salamat-Zadeh
@BradLarson Fair o suficiente e bem localizado. Agora que tenho um entendimento, não poderia escrever uma resposta que compare melhor os três métodos, referenciando os links para obter detalhes adicionais?
Farbod Salamat-Zadeh
2
@ FarbodSalamat-Zadeh - Com certeza. Reabri a pergunta, se você acha que pode fornecer uma resposta melhor. Só não queria deixá-lo sem resposta, se pudesse.
Brad Larson

Respostas:

395

onCreate ():

O onCreate()método em um Fragmenté chamado após o Activity'sonAttachFragment() mas antes disso Fragment' s onCreateView().
Nesse método, você pode atribuir variáveis, obter Intentextras e qualquer outra coisa que não envolva a hierarquia de exibição (ou seja, inicializações não gráficas). Isso ocorre porque esse método pode ser chamado quando o Activityarquivo onCreate()não estiver concluído e, portanto, tentar acessar a hierarquia Exibir aqui pode resultar em uma falha.

onCreateView ():

Depois que o onCreate()é chamado (no Fragment), o Fragment's onCreateView()é chamado. Você pode atribuir suas Viewvariáveis ​​e fazer qualquer inicialização gráfica . Espera-se que você retorne a Viewdeste método, e esta é a visualização principal da interface do usuário, mas se você Fragmentnão usar layouts ou gráficos, poderá retornar null(isso acontece por padrão se você não substituir).

onActivityCreated ():

Como o nome indica, este é chamado após o Activity's onCreate()completou . É chamado depois onCreateView()e é usado principalmente para inicializações finais (por exemplo, modificar elementos da interface do usuário).


Para resumir ...
todos eles são chamados no Fragmentmas são chamados em momentos diferentes.
O onCreate()primeiro é chamado, por realizar inicializações não gráficas. Em seguida, você pode atribuir e declarar quaisquer Viewvariáveis ​​nas quais deseja usar onCreateView(). Posteriormente, use onActivityCreated()para fazer as inicializações finais que desejar, depois que tudo estiver concluído.


Se você deseja visualizar a documentação oficial do Android, ela pode ser encontrada aqui:
- - -onCreate()
onCreateView()
onActivityCreated()

Também há perguntas / respostas um pouco diferentes, mas menos desenvolvidas, aqui no Stack Overflow:

Farbod Salamat-Zadeh
fonte
6
Eu pensei em implementar inicializações não gráficas em onCreate () para que elas não sejam chamadas novamente quando a tela for girada. Acontece que eu tenho que chamar fragment.setRetainInstance (true), caso contrário onCreate () e onCreateView () são chamados novamente quando a tela é girada.
11406 Damn Vegetables Ver todas as
Em onCreateView (), é seguro acessar a hierarquia de exibição?
Cody
@ Cody Eu acredito que sim - acessar a hierarquia de visualizações é o objetivo exato de onCreateView.
Farbod Salamat-Zadeh
1
No entanto, onCreate () da atividade pode não ser concluído até onActivityCreated ()? Existe alguma chance de falha no onCreateView para acessar a hierarquia de visualizações? Eu não sou certo o que é diferença entre onCreateView () / em onActivityCreated ()
Cody
1
Uma coisa a ser observada (pelo menos com o AppCompatActivity) é que quando a atividade é recriada (por exemplo, depois de minimizada e eliminada), os fragmentos onCreate () serão chamados antes que as atividades onCreate () e super.onCreate () sejam concluídas. Isso pode ser um problema se você estiver usando algo como o Dagger e precisar acessar algo na atividade dos pais que é injetado. Uma solução para isso é colocar o código em onActivityCreated () que é chamado sempre chamado de onCreate ().
Nicholas
144

Para quem procura uma resposta concisa e pictórica:

insira a descrição da imagem aqui https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


E,

insira a descrição da imagem aqui

Pulp Fiction
fonte
21
Acordado. Comic Sans é necessário para coisas como esta
Kartik Chugh
1
É a primeira vez que vejo três fontes diferentes no mesmo diagrama e, de alguma forma, minha vida parece completa agora.
Gil Sand
Quando exatamente um fragmento poderia reiniciar?
Saurabh
1
Como é que o fragmento não é recriado depois que o processo está morto? AFAIK, apenas o estado da tarefa preservado como um pacote configurável e recriado, o aplicativo é trazido para primeiro plano novamente.
stdout
6

onActivityCreated () - descontinuado

onActivityCreated()agora está obsoleto como fragmentos versão 1.3.0-alpha02

O método onActivityCreated () agora está obsoleto. O código que toca na visualização do fragmento deve ser feito em onViewCreated () (que é chamado imediatamente antes de onActivityCreated ()) e outro código de inicialização deve estar em onCreate (). Para receber um retorno de chamada especificamente quando o onCreate () da atividade estiver concluído, um LifeCycleObserver deve ser registrado no ciclo de vida da atividade em onAttach () e removido assim que o retorno de chamada onCreate () for recebido.

Informações detalhadas podem ser encontradas aqui

Gastón Saillén
fonte