【问题标题】:NavHostFragment vs FragmentContainerView [Android]NavHostFragment 与 FragmentContainerView [Android]
【发布时间】:2020-07-14 09:45:26
【问题描述】:

您好,我正在浏览开发者 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 的提示,但它总是对我崩溃,我猜 fragmentcontainerview 就像一个框架布局,我总是继续使用 fragment
  • @takieddine 如果崩溃发生在findNavController,请检查下面的答案。
  • 正如我在文档中所读到的,FragmentContainview 扩展了 framelayout,它在实现事务时很有用,因为 NavHostFramgent 是导航工作所必需的,因为它充当所有片段的控制器并制作它们交易,如有错误,请指正

标签: android android-studio android-architecture-navigation android-jetpack-navigation


【解决方案1】:

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
    

【讨论】:

  • 啊,所以我想答案是将 FragmentConainerView 类型转换为 NavhostFragment ?
  • @takieddine 如果您使用 OnCreate 方法中的代码(大多数情况下),则需要。原因是here
【解决方案2】:

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

FragmentContainerView 包含 Framelayout 中的所有功能,并在 Fragment Transition 等中添加了一些功能。

注意:FragmentContainerView 替换 &lt;FrameLayout&gt;&lt;fragment&gt; 而不是 NavHostFragment。

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2021-10-04
    • 2020-04-04
    • 2021-07-04
    • 2018-11-25
    相关资源
    最近更新 更多