【问题标题】:How to use NavHostFragment with FragmentContainerView?如何将 NavHostFragment 与 FragmentContainerView 一起使用?
【发布时间】:2021-01-20 04:46:58
【问题描述】:

我很好奇我在使用导航组件时遇到的问题,特别是在托管 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)
    }
}

【问题讨论】:

    标签: android android-fragments android-activity android-architecture-navigation android-viewbinding


    【解决方案1】:

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

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

    class LauncherActivity : AppCompatActivity() {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-01
      • 2020-09-01
      • 1970-01-01
      • 2020-04-04
      • 2021-01-02
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多