【问题标题】:Does findFragmentById take in a FrameLayout rather than a Fragment?findFragmentById 是否接受 FrameLayout 而不是 Fragment?
【发布时间】:2021-04-21 19:01:57
【问题描述】:

我不熟悉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吗?我在文档中读到它已被弃用。

谢谢!

【问题讨论】:

    标签: java android android-fragments android-fragment-manager


    【解决方案1】:

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

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

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

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

    FragmentManger(来自android.app 包)及其getFragmentManager() 已被弃用,您应该使用FragmentManager(来自androidx.fragment.app 包)和getSupportFragmentManager(),就像您已经使用的那样。

    有关更多信息,您可以查看FragmentManager docFragment lifecycle

    【讨论】:

      【解决方案2】:
      1. 它将查看具有给定 ID 的容器,并为您提供当前在其中的 FragmentfindFragmentById 绝不会初始化 Fragment,顾名思义,它只会查看现有的。

      2. 您不应在新版本的 Android 上使用本机 FragmentManager,因为它已被弃用,而应使用 AndroidX Fragment 库中的 FragmentManager,提供相同的功能。 另见:https://developer.android.com/guide/fragments/fragmentmanager

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        相关资源
        最近更新 更多