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()(我知道它现在已被弃用,但它肯定是有用途的)?
不幸的是,文档无助于理解这一点。
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。
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |