NavHostFragment 与 FragmentContainerView [Android]

NavHostFragment vs FragmentContainerView [Android]

您好,我正在阅读开发人员 Android 网站上的导航指南,并按照说明创建了一个 NavHostFragment:

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"

        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

然而,当该代码存在时,IDE 建议我将 NavHostFragment 替换为 FragmentContainerView

有什么区别,什么时候应该分别使用它们而不是另一个?

谢谢

如果您探索 FragmentContainerView 的源代码,您会发现它 extends FrameLayout。

FragmentContainerView 包含 Framelayout 中的所有功能,以及片段过渡等中的一些新增功能。

注意:FragmentContainerView 替换了 <FrameLayout><fragment> 而不是 NavHostFragment。

要了解更多有关 FragmentContainerView 的信息,请查看 this article

希望对您有所帮助。

FragmentContainerView 是一个自定义布局,专门设计为片段的容器。 NavHostFragment 负责在导航组件中交换目的地。

您可以使用:

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/xxxxx"
    app:defaultNavHost="true"

    ..>

和:

val navController = findNavController(R.id.nav_host_fragment)

或者您可以使用:

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/xxxx"
    app:defaultNavHost="true"

    ..>

与:

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController