导航主机片段重复 ID

Nav Host Fragment Duplicate id

我已经找到了解决办法。但是花了很长时间,偶然发现了很多参考资料,所以我会把它留在这里。

此应用存在与 Nav Controller 相关的 MVVM 数据绑定抛出错误。

片段最初在我的 activity 中的数据绑定行上的 NavHostFrament 上给出了 重复 ID 错误。删除 android:id 或 android:name 导致构建错误或运行时错误。

Activity.kt

     binding = DataBindingUtil.setContentView(this, R.layout.activity_home)
     .
     .
     .
     val navController = findNavController(R.id.nav_host_fragment)

Layout.xml

  <fragment 
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/mobile_navigation"/> 

虽然片段行给了我一个转换为 FragmentContainerView 的 lint 检查,但它开始抛出 NavController not set 错误。

我将片段标签转移到一个单独的 xml 文件中。虽然我认为这不是必需的。

nav_header.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/mobile_navigation" />

至于Activity文件。 按照这个 link... https://issuetracker.google.com/issues/142847973#comment4

已替换

val navController = findNavController(R.id.nav_host_fragment)

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

我遇到了同样的问题,然后我意识到我使用 setContentView() 方法和 DataBindingUtil.setContentView() 方法设置了活动的内容视图。我删除了其中一个,问题就解决了。

我替换了我的代码:

setContentView(R.layout.activity_main)
val binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

至:

val binding = DataBindingUtil.setContentView(this, R.layout.activity_main)