从 `onCreateView` 调用 `getActivity()` 是否安全?

gsc*_*tti 0 android fragment android-activity

查看 Fragment 生命周期(例如此处),Activity 似乎在发出任何其他回调之前附加到 Fragment(这是由onAttach()方法通知的)。

在我的由单个活动组成的应用程序中,第一个 Fragment 是从onCreate()Activity的方法中打开的(实际上它是在里面完成的最后一件事onCreate())。

目前,我正在onCreateView()回调中初始化我的所有图形元素,包括一些ArrayAdapter需要构造 Activity 的对象(如)的实例化,这是通过调用getActivity(). 我假设此时 Activity 肯定存在,因为该onAttach()方法已经被调用。
我注意到 IntelliJ 警告我getActivity()返回的可能性null,可能只是因为该方法被注释为@Nullable,所以我开始在网上搜索我的假设是否真的正确,现在我很困惑:getActivity()在内部调用是否真的安全onCreateView()? 为什么有一个方法被调用onActivityCreated()(我知道它现在已被弃用,但它肯定是有用途的)?

不幸的是,文档无助于理解这一点。

ian*_*ake 5

根据官方 Fragment 生命周期文档

FragmentManager 还负责将 Fragment 附加到它们的宿主 Activity 并在 Fragment 不再使用时分离它们。Fragment 类有两个回调方法onAttach()onDetach(),您可以覆盖它们以在发生这些事件之一时执行工作。

所以在onAttach()and之间onDetach()getActivity()将始终返回一个非空值,Activity并且该页面继续说:

onAttach()始终在任何Lifecycle 状态更改之前调用。

onDetach()在任何Lifecycle 状态更改后始终调用。

因此,是的,onCreateView()作为生命周期状态更改,将意味着getActivity()返回非空值。

这正是用例requireActivity()- 它允许您告诉片段系统您知道在那个时间getActivity()点将返回一个非空值,并且您希望编译时保证您requireActivity()调用之后的任何代码都可以访问一个非空的活动。

至于onActivityCreated(),根据这个答案,这是一个非常糟糕的命名方法

您永远不需要等待onActivityCreated()调用requireActivity()getActivity()- 一旦 Fragment 附加到 FragmentManager,它们都可用,因此可以在onAttach(), onCreate(), onCreateView(), 中使用onViewCreated() all beforeonActivityCreated()被调用时使用。

这是onActivityCreated()被弃用的原因之一——它实际上与可供 Fragment 使用的活动无关,也与完成其活动的活动无关onCreate()(事实上​​,它可以被多次调用——每个创建 Fragment 视图的时间,而不是第一次 Activity 完成后的一次onCreate())。

当然,需要注意的是API,如ArrayAdapter不能要求一个活动-它们需要Context。还有类似的方法getContext()requireContext()所首选,如果你是专门寻找Context