如何将 NavHostFragment 与 FragmentContainerView 一起使用?

How to use NavHostFragment with FragmentContainerView?

我很好奇我在使用导航组件时遇到的问题,特别是在托管 NavHostFragment 方面。我有一个带有几个片段的单一 Activity 本机应用程序。我在启动器的 xml 中,将 <fragment> 替换为 <androidx.fragment.app.FragmentContainerView>

初步实施已按预期运行了一年。在本周介绍 FragmentContainerView 时,起始目的地的屏幕不会在启动时呈现。然而,我观察到证明从网络和缓存传入的数据成功的日志。从此状态开始,仅通过旋转设备触发配置更改会按预期呈现 UI。

我的 AndroidX NavigationFragmentKtx 和 NavigationUiKtx 依赖项是版本 2.3.2。相关文件略。有什么突出的我错过了吗?任何想法表示赞赏。

launcher_activity.xml

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/launcher_navHost"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />

LauncherActivity.kt

class LauncherActivity : AppCompatActivity(R.layout.launcher_activity) {
    private lateinit var viewBinding: LauncherActivityBinding
    
    private val navController: NavController by lazy {
        val navHost = supportFragmentManager.findFragmentById(
            R.id.launcher_navHost
        ) as NavHostFragment
        navHost.navController
    }
        
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewBinding = LauncherActivityBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)
    }
}

您正在使用 AppCompatActivity(R.layout.launcher_activity),这意味着您将自动调用 setContentView(R.layout.launcher_activity) 作为 super.onCreate(savedInstanceState) 的一部分(这就是传递布局 ID 的作用)。然后,您将通过第二次调用 setContentView().

来覆盖该布局

如果您正在使用视图绑定,则可以删除 R.layout.launcher_activity 部分,因为不需要它(也是问题的根源):

class LauncherActivity : AppCompatActivity() {