为啥我们可以在 onActivityCreated 之前运行的 onCreateView 中调用 getActivity()?

Posted

技术标签:

【中文标题】为啥我们可以在 onActivityCreated 之前运行的 onCreateView 中调用 getActivity()?【英文标题】:why we can call getActivity() in onCreateView which run before onActivityCreated?为什么我们可以在 onActivityCreated 之前运行的 onCreateView 中调用 getActivity()? 【发布时间】:2015-09-23 01:05:08 【问题描述】:

我真的对Fragmentlifecycle 感到困惑,尤其是在打电话给getActivity() 的时候。有时您无法通过getActivity() 获得Activity。而且它总是会引起一些令人费解的错误。 感谢任何人都可以解决这个难题。

【问题讨论】:

请提供相关代码示例! 来自Fragments documentation:Caution: If you need a Context object within your Fragment, you can call getActivity(). However, be careful to call getActivity() only when the fragment is attached to an activity. When the fragment is not yet attached, or was detached during the end of its lifecycle, getActivity() will return null.。所以应该从onAttach调用。 @EricMartinez 我认为这不是对文档的正确解释。我的理解是,由于在调用 onAttach() 时片段与活动相关联,因此它也必须可用于以下生命周期方法,如 onCreate() 和 onCreateView(),即使在 onActivityCreated 之前调用它们会令人困惑()。无论如何,我不记得在 onCreateView() 中调用 getActivity() 时会得到 null,而我编写的所有 android 应用程序都做到了。 【参考方案1】:

getActivity() 可以为 null,而您的片段正在准备中并即将准备好。

片段生命周期绑定回调方法。这些方法将在片段准备时及时调用。

Fragment.onActivityCreated(Bundle) 是片段活动不会为空的地方,即getActivity() 将是一个有效的实例。它发生在onCreateView() 之后

对于活动存在,您最安全的选择是:

Fragment.onViewCreated(View, Bundle) Fragment.onStart()

【讨论】:

如果我需要一个活动来在 onCreate 中创建适配器怎么办? 我在 'Fragment.onViewCreated(View, Bundle)' 中有几次 'getActivity() == null',所以不安全,你必须经常检查 getActivity() 是否不为 null在“onCreateView()”、“onViewCreated()”甚至“onResume()”中 我们不赌东西。它应该是 onAttach() 中的有效活动,或者不是。为什么getActivity()的使用没有明确的答案? @SteveM 大拇指,因为我们不打赌 :) 猜测糟透了。您可以根据 Android Studio 生成的用于片段/活动通信的模板代码获取活动 onAttach。【参考方案2】:

根据the current documentation (Dec 2018),显示onAttach()onCreate()onCreateView()之前的开头被调用。在这些方法中getActivity() 应该是安全的。


在Support v4 Fragment documentation for onActivityCreated() 中说这种方法是:

在创建片段的 Activity 并实例化该片段的视图层次结构时调用。

这里的重要部分是“活动已创建”,即Activity.onCreate() 已完成执行。在此之前,我们仍处于该方法中。

这可以通过查看the FragmentActivity.onCreate() source code 来确认,您可以遵循在方法开始时将片段附加到活动的过程,然后恢复片段状态等。所以活动应该在所有这些中都有效地方,但从技术上讲,它还没有完成整个创建过程。

【讨论】:

以上是关于为啥我们可以在 onActivityCreated 之前运行的 onCreateView 中调用 getActivity()?的主要内容,如果未能解决你的问题,请参考以下文章

Android 片段 onCreateView 与 onActivityCreated

对onActivityCreated片段回调有啥误解吗?

在 onActivityCreated() 之后再次调用 Fragment 的 onAttach()

如何在 OnActivityCreated 中解决这个不受欢迎的问题?

onActivityCreated 已弃用,如何正确使用 LifecycleObserver?

在 onActivityCreated/onStart/onViewCreated 方法内的 getView() 上出现 NullPointerException 警告