Fragment中onCreate()、onCreateView()和onActivityCreated()的区别和使用

Posted

技术标签:

【中文标题】Fragment中onCreate()、onCreateView()和onActivityCreated()的区别和使用【英文标题】:Difference and uses of onCreate(), onCreateView() and onActivityCreated() in fragments 【发布时间】:2015-05-09 21:05:57 【问题描述】:

片段中的onCreate()onCreateView()onActivityCreated() 有什么区别,它们各自的用途是什么?

【问题讨论】:

另见:***.com/questions/27227906/… @BradLarson 我不明白为什么它被关闭了。事实证明,这是一个相对受欢迎的问题,与您评论中所述的链接不同。这个问题是询问三种不同方法之间的区别以及它们如何相互比较,但您在评论中链接的问题只提到了其中两种方法。 @BradLarson 够公平,也很明显。现在虽然我有所了解,但我能否写一个更好地比较这三种方法的答案,参考链接以获取更多详细信息? @FarbodSalamat-Zadeh - 当然。如果您认为可以提供更好的答案,我已经重新提出了这个问题。如果可以的话,我只是不想让它无人回答。 【参考方案1】:

更新:

onActivityCreated() 已从 API 级别 28 中弃用。


onCreate():

Fragment 中的onCreate() 方法ActivityonAttachFragment() 之后调用,但在FragmentonCreateView() 之前调用。 在此方法中,您可以分配变量、获取 Intent 额外内容以及不涉及视图层次结构的任何其他内容(即非图形初始化)。这是因为这个方法可以在ActivityonCreate()没有完成的时候调用,所以在这里尝试访问View层级可能会导致崩溃。

onCreateView():

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

onActivityCreated():

顾名思义,这是ActivityonCreate() 完成后调用。它在onCreateView() 之后调用,主要用于最终初始化(例如,修改 UI 元素)。这在 API 级别 28 中已弃用


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


如果你想查看android官方文档,可以在这里找到:

onCreate() onCreateView() onActivityCreated()_

Stack Overflow 上也有一些略有不同但不太完善的问题/答案:

onCreate() vs onCreateView() onCreateView() vs onActivityCreated()

【讨论】:

我想我会在 onCreate() 实现非图形初始化,这样当屏幕旋转时就不会再次调用它们。事实证明,我必须调用 fragment.setRetainInstance(true) 否则在屏幕旋转时会再次调用 onCreate() 和 onCreateView()。 在 onCreateView() 中,访问视图层次结构安全吗? 但是,活动的 onCreate() 可能要到 onActivityCreated() 才能完成?这些是否有可能在 onCreateView 中崩溃以访问视图层次结构?我不确定 onCreateView() / on onActivityCreated() 有什么区别 需要注意的一点(至少对于 AppCompatActivity)是,当重新创建活动时(例如,在最小化和杀死之后)片段 onCreate() 将在活动 onCreate() 和super.onCreate() 完成。如果您使用 Dagger 之类的东西并且需要访问注入的父活动中的某些内容,这可能是一个问题。对此的一种解决方案是将代码放在 onActivityCreated() 中,该代码始终调用 onCreate() 调用。 一旦调用了它的片段的onCreateView,假设活动的onCreate已经完成,是否可以保存?【参考方案2】:

onActivityCreated() - 已弃用

onActivityCreated() 现在已弃用为 Fragments Version 1.3.0-alpha02

onActivityCreated() 方法现已弃用。代码触及 片段的视图应该在 onViewCreated() 中完成(称为 在 onActivityCreated()) 和其他初始化代码之前 应该在 onCreate() 中。专门接收回调时 活动的 onCreate() 完成后,应该是 LifeCycleObserver 在 onAttach() 中注册到活动的生命周期,并删除一次 收到 onCreate() 回调。

详细信息可查看here

【讨论】:

【参考方案3】:

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

https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


还有,

【讨论】:

同意。 Comic Sans 对于这样的事情是必要的 这是我第一次在同一张图中看到 3 种不同的字体,不知怎的,我的生活现在感觉很完整。 片段究竟什么时候可以重启? 进程死了怎么不重新创建片段? AFAIK,只有任务状态保存为一个包并重新创建应用程序再次被带到前台。

以上是关于Fragment中onCreate()、onCreateView()和onActivityCreated()的区别和使用的主要内容,如果未能解决你的问题,请参考以下文章

更新到 androidx.fragment:fragment:1.3.0-alpha08:在 onCreate 之后不再允许 registerForActivityResult。 onCreate后如

Fragment中onCreate()、onCreateView()和onActivityCreated()的区别和使用

重新加载 Fragment 时多次调用 Fragment onCreate

为啥会调用fragment的onCreateView、onCreate、onActivityCreated

Android 崩溃 onCreate() - Fragment 无法转换为 androidx.navigation.fragment.NavHostFragment

在活动的 onCreate 之前调用 Fragment 的 onCreateView