为什么我的NavController找不到我已经有的ID?

25

每次我启动我的应用程序时,它都会崩溃并且Logcat会显示以下内容:

Caused by: java.lang.IllegalArgumentException: ID does not reference a View inside this Activity

所以我认为这是说没有找到ID,但这是我的Java文件和相应的XML文件:

NavController navController = Navigation.findNavController(this,R.id.nav_host_fragment);

XML:

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <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_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.285"
        app:navGraph="@navigation/mobile_navigation" />

Logcat显示失败是因为Java文件中的ID没有引用此Activity内部的View。但我明确输入了ID:nav_host_fragment。 我不知道出了什么问题,当我在Android Studio中并没有报告任何错误。请帮忙。


你是在 setContentView() 之后调用 findNavController 吗?你能展示一下你的 Activity 代码吗? - ianhanniballake
在setContentView()之前。 - Robotic Reaper
4个回答

49

Navigation.findNavController 依赖于 findViewById(),而后者仅在您调用 setContentView() 后才起作用 - 也就是说,您实际上需要将视图添加到活动中。


1
无论您是直接设置内容视图还是通过DataBinding设置,都没有区别。 - ianhanniballake

8

使用适当的控制器以避免在此Activity或片段中引用ID时无法找到视图?

如果您正在使用Java

在Activity中使用:

NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment)

在 Fragment 中使用
NavController navController = NavHostFragment.findNavController(this)
// or
NavHostFragment.findNavController(view)

如果您正在使用Kotlin:
在Activity中使用:
val navController = findNavController(R.id.nav_host_fragment)

在 Fragment 中使用

val navController = findNavController()

4

我认为我们必须在视图创建后使用它。尝试将代码放在onPostCreate中,它可以正常工作。

注:在onCreateView中它无法正常工作。

override fun onPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onPostCreate(savedInstanceState, persistentState)

    val navController=findNavController(R.id.navHostFragment)

}

0
如果有人遇到我曾经遇到的问题,这里是解决方法。我试图访问导航中的嵌套资源。
不要这样:
val navController = findNavController(R.id.nav_print)

更新至

val navController = findNavController(R.id.nav_host_fragment_content_main)
navController.navigate(R.id.nav_print)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接