onActivityCreated deposition:如何使用NavigationComponent添加片段作为Ma



我刚刚看到onActivityCreated((在未来将被弃用。我试图实现LifecycleOwner和LifecycleObserver模式,但我不太确定我在这里做什么。

我正在使用NavigationComponent,它满足:

  • 我有一个主要活动
  • 我有一个MainFragment,安装为home fragment
  • 我有多个片段可以从这个主页片段访问

由于某些原因,我需要知道何时从所有这些片段(主片段和子片段(创建活动

从我所看到的到现在,我需要:

  • 在主活动中,getLifecycle().addObserver(new MainFragment())。并对所有子片段执行此操作(这是多余的(
  • 在片段中,实现LifecycleObserver和
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreateEvent() {
Timber.i("%s MainActivity created", TAG);
}

这似乎很有效,但我有一些问题:

  1. 语法addObserver(new MainFragment()让我感到不安。看起来我们正在创建一个新的片段实例,而片段通常是用navGraph中定义的导航来实例化的
  2. 正如我之前所说,如果我的MainFragment有10个子片段,我就必须声明11个观察者?怪异
  3. 我是否必须在活动生命周期的某个时刻清除这些观察者

实现它的正确方法是什么?

第1版:要回答为什么我需要知道活动何时创建的问题:我需要这个,因为我需要访问我的MainActivity视图模型(new ViewModelProvider(requireActivity()).get(ViewModel.class)。要调用requireActivity()getActivity(),我需要知道活动是何时创建的(使用onActivityCreated((很容易(。数据绑定是用我的MainActivity和这个视图模型实现的。此活动的布局是托管一个加载程序,以显示何时执行网络请求。我可以执行来自MainFragment和子片段的请求。当我从其中一个片段执行请求时,我需要启用这个加载程序视图,当我取回数据时,我必须隐藏这个加载程序。是的,所有这些碎片都在图中

您永远不需要等待onActivityCreated()调用requireActivity()getActivity()-只要Fragment连接到FragmentManager,它们都可用,因此可以在调用onActivityCreated()之前在onAttach()onCreate()onCreateView()onViewCreated()中使用。

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

根据折旧通知:

对触及Fragment视图的代码使用onViewCreated(View, Bundle),对其他初始化使用onCreate(Bundle)

根据您在onActivityCreated()中的代码是否正在访问Fragment的视图,这些是建议的替换。

一旦您意识到requireActivity()可以在onAttach()等中调用,那么弃用通知的其余部分就更有意义了:

要在调用Fragment活动的Activity.onCreate(Bundle)时获得回调,请在onAttach(Context)中的活动生命周期中注册LifecycleObserver,并在收到Lifecycle.State.CREATED回调时将其删除。

@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
// Register a LifecycleObserver on the Activity's Lifecycle in onAttach()
requireActivity().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreateEvent() {
// Remove the LifecycleObserver once you get a callback to ON_CREATE
requireActivity().getLifecycle().removeObserver(this);
// Then do your logic that specifically needs to wait for the Activity
// to be created
Timber.i("%s MainActivity created", TAG);
}

但是,如上所述,如果您试图在活动级别访问ViewModel,则这不是您应该执行的操作。

最新更新