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()
方法在Activity
的onAttachFragment()
之后调用,但在Fragment
的onCreateView()
之前调用。
在此方法中,您可以分配变量、获取 Intent
额外内容以及不涉及视图层次结构的任何其他内容(即非图形初始化)。这是因为这个方法可以在Activity
的onCreate()
没有完成的时候调用,所以在这里尝试访问View层级可能会导致崩溃。
onCreateView():
在调用onCreate()
之后(在Fragment
中),调用Fragment
的onCreateView()
。您可以分配您的 View
变量并进行任何图形初始化。你应该从这个方法返回一个View
,这是主UI视图,但是如果你的Fragment
不使用任何布局或图形,你可以返回null
(如果你不使用默认情况下发生覆盖)。
onActivityCreated():
顾名思义,这是在Activity
的onCreate()
完成后调用。它在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