NavHostFragment与FragmentContainerView的区别 [Android]

6

你好,我正在阅读开发者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。它们之间有什么区别,在何时应使用它们而不是另一个?谢谢。

1
我并不像它一直提示我改用FragmentContainerView,但每次尝试都会导致崩溃。我猜FragmentContainerView就像FrameLayout一样,但我仍然坚持使用Fragment。 - Taki
@takieddine 如果崩溃发生在findNavController中,请查看下面的答案。 - Gabriele Mariotti
1
根据文档,FragmentContainview扩展了Framelayout,在实现事务时非常有用;而NavHostFramgent则是必要的,因为它充当所有片段的控制器并使它们进行事务。如果有错误,请纠正我。 - Taki
2个回答

11

FragmentContainerView是专门设计为Fragment容器的自定义布局。 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
    

啊,我猜答案就是将FragmentContainerView强制转换为NavhostFragment? - Taki
如果您在OnCreate方法中使用代码(大多数情况下),则需要这样做。原因在此处 - Gabriele Mariotti

2
如果你查看 FragmentContainerView 的源代码,你会发现它是在 FrameLayout 的基础上进行了扩展。 FragmentContainerView 包含了 Framelayout 中所有的特性,并且增加了一些 Fragment Transition 等功能。
注意:FragmentContainerView 用来替代 <FrameLayout><fragment>,而不是 NavHostFragment。
如果想要了解更多关于 FragmentContainerView 的信息,请参考这篇文章
希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接