片段中onCreate(),onCreateView()和onActivityCreated()的区别和用途


329

什么是之间的差异onCreate()onCreateView()以及onActivityCreated()将它们各自用于片段和什么?



@BradLarson我不明白为什么关闭了它。它被证明是一个相对受欢迎的问题,与您的评论中所述的链接不同。这个问题是要问三种不同方法之间的区别以及它们之间的比较方式,但是您在评论中链接的问题仅提及了这两种方法。
Farbod Salamat-Zadeh,2015年

@BradLarson公平,并被发现。现在,尽管我已经了解了,但我是否可以写出一个更好地比较这三种方法的答案,请参考链接以获取更多详细信息?
Farbod Salamat-Zadeh,2015年

2
@ FarbodSalamat-Zadeh-好的。如果您认为您可以提供更好的答案,那么我已经重新提出了问题。如果可以的话,我只是不想让它无所适从。
布拉德·拉尔森

Answers:


394

onCreate():

onCreate()在的方法Fragment后叫ActivityonAttachFragment(),但在这之前FragmentonCreateView()
在这种方法中,您可以分配变量,获取Intent额外内容以及不涉及View层次结构的任何其他内容(即非图形初始化)。这是因为这种方法可以被称为当ActivityonCreate()还没有完成,所以想在这里访问View层次结构可能导致崩溃。

onCreateView():

在之后onCreate()被调用(在Fragment)的FragmentonCreateView()叫。您可以分配View变量并进行任何图形初始化。您应该View从此方法返回a ,这是主要的UI视图,但是如果您Fragment不使用任何布局或图形,则可以返回null(默认情况下,如果不覆盖,则会发生)。

onActivityCreated():

正如其名国,这是后叫ActivityonCreate()完成。它在after之后被调用onCreateView(),主要用于最终初始化(例如,修改UI元素)。


总结一下……
它们都在中Fragment被调用,但是在不同的时间被调用。
首先onCreate()称为,用于进行任何非图形初始化。接下来,您可以分配和声明View要在中使用的任何变量onCreateView()。然后,使用onActivityCreated()来完成所有想要完成的最终初始化。


如果你想查看官方Android文档,也可以在这里找到:
- - -onCreate()
onCreateView()
onActivityCreated()

Stack Overflow上也有一些稍有不同,但尚不完善的问题/答案:


6
我以为我会在onCreate()上实现非图形初始化,以便在旋转屏幕时不会再次调用它们。事实证明,我必须调用fragment.setRetainInstance(true),否则在旋转屏幕时会再次调用onCreate()和onCreateView()。
该死的蔬菜

在onCreateView()中,访问视图层次结构安全吗?
科迪

@Cody我相信,如此访问视图层次结构是的确切目的onCreateView
Farbod Salamat-Zadeh's

1
但是,活动的onCreate()可能要等到onActivityCreated()之后才能完成?这些是否有可能在onCreateView中崩溃以访问视图层次结构?我不确定onCreateView()/ onActivityCreated()之间有什么区别
Cody

1
需要注意的一件事(至少在AppCompatActivity中)是,当重新创建活动时(例如,在最小化和终止活动之后),将在活动onCreate()和super.onCreate()完成之前调用片段onCreate()。如果您使用的是Dagger之类的东西,并且需要在注入的父活动中访问某些东西,那么这可能是个问题。一种解决方案是将代码放入onActivityCreated()中,该代码总是被调用onCreate()进行调用。
尼古拉斯

144

对于任何寻求简洁的图示答案的人:

在此处输入图片说明 https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


和,

在此处输入图片说明


21
同意 像这样的事情必不可少的可笑的Sans
Kartik Chugh '18

1
这是我第一次在同一张图中看到3种不同的字体,现在某种程度上我的生活感觉很完整。
吉尔·桑德

片段什么时候才能重新开始?
Saurabh

1
一旦流程死了,怎么不重新创建该片段呢?AFAIK,仅将任务状态保留为捆绑包,然后重新创建该应用程序,然后再次置于前台。
stdout

6

onActivityCreated()-已弃用

onActivityCreated()现在不建议使用Fragments Version 1.3.0-alpha02

现在不建议使用onActivityCreated()方法。接触片段视图的代码应在onViewCreated()中完成(在onActivityCreated()之前立即调用),其他初始化代码应在onCreate()中。要专门在活动的onCreate()完成时接收回调,应在onAttach()中的活动生命周期上注册LifeCycleObserver,并在收到onCreate()回调后将其删除。

详细信息可以在这里找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.