gpt4 book ai didi

android - onActivityCreated 弃用 : how to add fragments as observers of MainActivity using NavigationComponent

转载 作者:行者123 更新时间:2023-12-03 23:33:52 29 4
gpt4 key购买 nike

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

  • 我有一个 MainActivity
  • 我有一个 MainFragment,实例化为主 fragment
  • 我有多个可以从这个主页 fragment
  • 访问的 fragment

    由于某些原因,我需要知道何时从所有这些 fragment (MainFragment 和子 fragment )创建 Activity
    从我到目前为止所看到的,我需要:
  • 在 MainActivity 中,getLifecycle().addObserver(new MainFragment()) .并对所有子 fragment 执行此操作(这很冗长)
  • 在 fragment 中,实现 LifecycleObserver 和
  • @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void onCreateEvent() {
    Timber.i("%s MainActivity created", TAG);
    }
    这似乎运作良好,但我有一些问题:
  • 语法 addObserver(new MainFragment()打扰了我。看起来我们正在创建一个新的 fragment 实例,而 fragment 通常使用 navGraph 中定义的导航进行实例化。
  • 正如我之前所说,如果我的 MainFragment 有 10 个子 fragment ,我将不得不声明 11 个观察者?奇怪
  • 我是否必须在 Activity 生命周期的某个时刻清除这些观察者?

  • 实现它的正确方法是什么?
    编辑 1:
    要回答为什么我需要知道 Activity 何时创建的问题:
    我需要这个,因为我需要访问我的 MainActivity View 模型( new ViewModelProvider(requireActivity()).get(ViewModel.class)。要调用 requireActivity()getActivity(),我需要知道 Activity 何时创建(使用 onActivityCreated() 很容易)。
    数据绑定(bind)是用我的 MainActivity 和这个 viewmodel 实现的。此 Activity 的布局是托管一个加载程序,以显示何时执行网络请求。
    我可以执行来自 MainFragment 和来自子 fragment 的请求。当我从这些 fragment 之一执行请求时,我需要启用这个加载器 View ,当我取回数据时,我需要隐藏这个加载器。
    是的,所有这些 fragment 都在图中

    最佳答案

    您无需等待onActivityCreated()调用requireActivity()getActivity() - 只要将 Fragment 附加到 FragmentManager,它们都可用,因此可以在 onAttach() 中使用, onCreate() , onCreateView() , onViewCreated()全部在 onActivityCreated() 之前叫做。
    这就是为什么 onActivityCreated() 的原因之一。已弃用 - 它实际上与 fragment 可用的 Activity 无关,也与完成其 onCreate() 的 Activity 无关。 (事实上​​,它可以被调用多次——每次创建 Fragment 的 View 时,而不仅仅是在 Activity 第一次完成后调用 onCreate() )。
    根据 deprecation notice :

    use onViewCreated(View, Bundle) for code touching the Fragment's view and onCreate(Bundle) for other initialization.


    这些是推荐的替换,具体取决于您在 onActivityCreated() 中是否有代码。是否访问了 Fragment 的 View 。
    一旦你意识到 requireActivity()可调用 onAttach()等, deprecation notice 的其余部分更有意义:

    To get a callback specifically when a Fragment activity's Activity.onCreate(Bundle) is called, register a LifecycleObserver on the Activity's Lifecycle in onAttach(Context), removing it when it receives the Lifecycle.State.CREATED callback.

    @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);
    }
    但是,如上所述,这是 不是 如果您尝试在 Activity 级别访问 ViewModel,您应该做什么。

    关于android - onActivityCreated 弃用 : how to add fragments as observers of MainActivity using NavigationComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64174868/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com