onActivityCreated 弃用:如何使用 NavigationComponent 添加片段作为 MainActivity 的观察者

Gil*_*les 5 android android-lifecycle android-jetpack

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

我正在使用 NavigationComponent,这意味着:

  • 我有一个主活动
  • 我有一个 MainFragment,作为主片段实例化
  • 我有多个片段可以从这个主片段访问

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

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

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

这似乎运作良好,但我有一些问题:

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

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

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

ian*_*ake 11

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

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

根据弃用通知

使用onViewCreated(View, Bundle)代码触摸片段的观点和onCreate(Bundle)其他的初始化。

这些是推荐的替代品,具体取决于您使用的代码是否onActivityCreated()正在访问 Fragment 的视图。

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

要在调用 Fragment 活动时专门获得回调Activity.onCreate(Bundle),请LifecycleObserver在 Activity 的生命周期中注册onAttach(Context),在收到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);
}
Run Code Online (Sandbox Code Playgroud)

但是,如上所述,如果您尝试在活动级别访问 ViewModel ,这不是您应该做的。