在片段中,onCreate()、onCreateView()和onActivityCreated()的区别和用途是什么?

373
在Fragments中,onCreate()、onCreateView()和onActivityCreated()有什么区别,它们各自用于什么?

参见:https://dev59.com/-F4d5IYBdhLWcg3wDu-0 - Brad Larson
2
@BradLarson,我不明白为什么这个问题被关闭了。它已经被证明是一个相对受欢迎的问题,并且与您评论中提到的链接不同。这个问题正在询问三种不同方法之间的区别以及它们彼此之间的比较,但是您在评论中链接的问题只提到了其中两种方法。 - Farbod Salamat-Zadeh
@BradLarson 很好,你说得很对。既然我已经理解了,那么我不能写一个更好的答案来比较这三种方法,并引用链接提供额外的细节吗? - Farbod Salamat-Zadeh
3
@FarbodSalamat-Zadeh - 当然。我重新打开了问题,如果您认为您能提供更好的答案,那么请回答。我只是不想让它无人问津。 - Brad Larson
3个回答

449

更新:

onActivityCreated() 从 API Level 28 开始已被弃用。


onCreate():

Fragment 中的 onCreate() 方法在 ActivityonAttachFragment() 之后但在该 FragmentonCreateView() 之前被调用。在此方法中,您可以分配变量、获取 Intent extras 和任何不涉及 View 层次结构(即非图形化初始化)的内容。这是因为此方法可能在 ActivityonCreate() 完成之前被调用,因此在此处尝试访问 View 层次结构可能导致崩溃。

onCreateView():

Fragment 中调用 onCreate() 之后,会调用 FragmentonCreateView()。您可以分配视图变量并执行任何图形化初始化。您应该从此方法返回一个 View,这是主 UI 视图,但如果您的 Fragment 不使用任何布局或图形,则可以返回 null(如果您没有覆盖此方法,则会默认发生)。

onActivityCreated():

顾名思义,此方法在 ActivityonCreate() 完成后被调用。它在 onCreateView() 之后被调用,主要用于最终初始化(例如修改 UI 元素)。从 API level 28 开始,此方法已弃用


总结一下...
Fragment 中的 onCreate() 方法在 ActivityonAttachFragment() 之后但在该 FragmentonCreateView() 之前调用。在此方法中,您可以分配变量、获取 Intent extras 和任何不涉及 View 层次结构的内容。调用 onCreateView() 后,您可以执行图形化初始化。最终初始化应在已弃用onActivityCreated() 方法中完成。

它们都被称为Fragment,但在不同的时候被调用。
首先调用onCreate(),用于执行任何非图形化初始化。接下来,您可以在onCreateView()中分配和声明任何要在其中使用的View变量。之后,使用onActivityCreated()进行任何最终初始化,一旦完成了所有操作,就可以执行此操作。


如果您想查看官方的Android文档,请点击此处:

这里还有一些略微不同但较少开发的问题/答案在Stack Overflow上:


7
我原以为在onCreate()中实现非图形化初始化,这样当屏幕旋转时它们就不会再次被调用。结果发现我必须调用fragment.setRetainInstance(true),否则当屏幕旋转时,onCreate()和onCreateView()都会再次被调用。 - Damn Vegetables
1
然而,activity的onCreate()可能在onActivityCreated()之前没有完成?在onCreateView中访问视图层次结构是否存在崩溃的可能?我不确定onCreateView() / onActivityCreated()之间有什么区别。 - Cody
1
需要注意的一件事(至少在使用AppCompatActivity时)是,当活动被重新创建(例如在最小化和杀死后),片段的onCreate()将在活动的onCreate()和super.onCreate()完成之前被调用。如果您正在使用类似Dagger的东西并且需要访问注入的父活动中的某些内容,则可能会出现问题。解决此问题的一种方法是将代码放在onActivityCreated()中,该方法始终在调用onCreate()时调用。 - Nicholas
@razor 我认为这并没有太大的区别,onCreate 可能是最好的选择,但这取决于你想要处理何时完成。只需记住,在 onCreate 中无法访问视图层次结构。 - Farbod Salamat-Zadeh
1
假设 Fragment 的 onCreateView 被调用时,可以安全地假设其所在的 Activity 的 onCreate 已经完成了吗? - nullmn
显示剩余5条评论

171

36
同意。像这样的事情需要Comic Sans字体。 - Kartik Chugh
4
这是我第一次看到同一张图中使用三种不同字体,不知怎么的,我的人生现在感觉完整了。 - Gil Sand
一个片段什么时候可以重新启动? - Saurabh
1
当进程死亡后,片段为什么不会重新创建?据我所知,只有任务状态作为包被保存,当应用程序再次回到前台时才会重新创建。 - stdout

13

onActivityCreated() - 已弃用

onActivityCreated() 自Fragments 版本1.3.0-alpha02开始已被弃用。

onActivityCreated()方法现已被弃用。与Fragment视图相关的代码应在 onViewCreated() 中处理(该方法在 onActivityCreated()之前立即调用),其他初始化代码应在 onCreate()中处理。要在activity的 onCreate() 完成时特别接收一个回调,应该在 onAttach()中注册一个 LifeCycleObserver,并在接收到 onCreate()回调后将其删除。

详细信息请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接