如何解决onActivityCreated弃用:如何使用NavigationComponent
我刚刚看到onActivityCreated()将来会被弃用。我尝试实现LifecycleOwner和LifecycleObserver模式,但是我不确定我在这里做什么。
我正在使用NavigationComponent,这意味着:
- 我有一个MainActivity
- 我有一个MainFragment,被实例化为home片段
- 我有多个可以从此家庭片段访问的片段
出于某些原因,我需要知道何时从所有这些片段(MainFragment和子片段)创建活动
从我到目前为止所看到的,我需要:
- 在MainActivity中,
getLifecycle().addObserver(new MainFragment())
。并对所有子片段执行此操作(该操作很冗长) - 在片段中,实现LifecycleObserver和
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreateEvent() {
Timber.i("%s MainActivity created",TAG);
}
这似乎运作良好,但我有一些疑问:
- 语法
addObserver(new MainFragment()
困扰我。看起来我们正在创建一个新的片段实例,而该片段通常是通过navGraph中定义的导航实例化的。 - 正如我之前说的,如果我的MainFragment包含10个子片段,则必须声明11个观察者?很奇怪
- 我是否必须在活动生命周期的某个时候清除这些观察者?
实现它的正确方法是什么?
编辑1:
为了回答为什么我需要知道何时创建活动的问题:
我需要这样做是因为我需要访问MainActivity视图模型(new ViewModelProvider(requireActivity()).get(ViewModel.class)
。要调用requireActivity()
或getActivity()
,我需要知道何时创建活动(使用onActivityCreated()很容易)。
数据绑定是通过MainActivity和此视图模型实现的。该活动的布局是托管一个加载器,以显示何时执行网络请求。
我可以从MainFragment和子片段执行请求。当我从这些片段之一执行请求时,我需要启用此加载器视图,而当我取回数据时,则需要隐藏此加载器。
是的,所有这些片段都在图中
解决方法
您无需等待onActivityCreated()
来调用requireActivity()
或getActivity()
-只要Fragment附加到FragmentManager上,它们都可以使用,因此可以在{ {1}},onAttach()
,onCreate()
,onCreateView()
都在调用onViewCreated()
之前。
这是不推荐使用onActivityCreated()
的原因之一-它实际上与Fragment可用的活动无关,也与完成其onActivityCreated()
的活动无关(实际上,可以多次调用它-每次创建Fragment的视图时,而不仅仅是在Activity第一次完成onCreate()
之后一次)。
使用
onViewCreated(View,Bundle)
进行接触片段视图的代码,使用onCreate(Bundle)
进行其他初始化。
根据您在onCreate()
中使用的代码是否正在访问Fragment的视图,这些是推荐的替代方法。
一旦意识到onActivityCreated()
可以在requireActivity()
中调用,依此类推,其余的deprecation notice就会更有意义:
要专门在调用Fragment活动的
Activity.onCreate(Bundle)
时获得回调,请在LifecycleObserver
的Activity的生命周期中注册onAttach(Context)
,并在收到Lifecycle.State.CREATED
回调时将其删除
onAttach()
但是,如上所述,如果尝试在活动级别访问ViewModel,这应该不是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。