findFragmentById 是否采用 FrameLayout 而不是 Fragment?

Does findFragmentById take in a FrameLayout rather than a Fragment?

我对 Fragments

的概念很陌生

在我看的视频中,他们使用了这段代码:

FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentById(R.id.my_container);

        if(fragment == null){
            fragment = new FragmentMain();
            fragmentManager.beginTransaction()
                    .add(R.id.my_container, fragment)
                    .commit();
        }

通过 java 创建 Fragment

  1. findFragmentById 中他们传入了 FrameLayout(my_container) 而不是 Fragment。我在文档中读到您可以传入容器 ID,但它让我感到困惑的是如何将其初始化为 Fragment。这是如何工作的?

  2. 我应该使用FragmentManager吗?我在文档中读到它已被弃用。

谢谢!

  1. 它将查看具有给定 ID 的容器,并为您提供当前位于其中的 Fragment。在任何时候 findFragmentById 初始化 一个 Fragment,它只会查看现有的,顾名思义。

  2. 您不应使用提供相同功能的本机 FragmentManager on new versions of Android, as it has been deprecated, but the FragmentManager from the AndroidX Fragment 库。 另见:https://developer.android.com/guide/fragments/fragmentmanager

In findFragmentById they passed in a FrameLayout(my_container) rather than a Fragment. I read in the docs that you can pass in a container id, but it confuses me how it will initialize it as a Fragment. How does this work?

你可以把容器想象成一个占位符,一次可以容纳一个片段;最初它没有片段,在这种情况下 if(fragment == null) 将得到满足,因此您可以进行片段事务(因此,容器布局现在被片段视图替换,这是分配的另一个 xml 布局到此特定片段并由其 onCreateView() 回调返回。onCreateView() 是片段的生命周期回调之一,系统会调用该回调,直到该片段在占位符中对用户完全可见为止。

稍后当您希望此占位符包含另一个片段时,您可以再次执行事务,它对新片段重复相同的事情,占位符将显示新片段的布局和生命周期方法此片段的一部分将被调用

Should I use FragmentManager? I read in the docs that it's deprecated.

FragmentManger (from android.app package) and its getFragmentManager() are deprecated, and you should use FragmentManager(来自 androidx.fragment.app 包)和 getSupportFragmentManager() 而不是像你已经做的那样。

有关更多信息,您可以查看 FragmentManager doc and Fragment lifecycle