NavHostFragment 与 FragmentContainerView [Android]

Wav*_*cle 6 android android-studio android-architecture-navigation android-jetpack-navigation

您好,我正在浏览 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" />
Run Code Online (Sandbox Code Playgroud)

然而,当该代码存在时,IDE 建议我将其替换NavHostFragmentFragmentContainerView.

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

谢谢

Gab*_*tti 11

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

您可以使用:

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

    ..>
Run Code Online (Sandbox Code Playgroud)

和:

val navController = findNavController(R.id.nav_host_fragment)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

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

    ..>
Run Code Online (Sandbox Code Playgroud)

和:

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    
Run Code Online (Sandbox Code Playgroud)