首页 > 解决方案 > findFragmentById 是否接受 FrameLayout 而不是 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();
        }

Fragment通过 java创建一个。

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

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

谢谢!

标签: javaandroidandroid-fragmentsandroid-fragment-manager

解决方案


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

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

稍后当您希望这个占位符保存另一个片段时,您可以再次执行事务,它与新片段重复相同的事情,占位符将显示新片段的布局,并且该片段的生命周期方法将得到叫

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

FragmentManger(from android.apppackage) 和它getFragmentManager()已被弃用,你应该使用FragmentManager(from androidx.fragment.apppackage) 而 getSupportFragmentManager()不是像你已经做过的那样。

有关更多信息,您可以查看FragmentManager 文档Fragment 生命周期


推荐阅读