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



每次我启动应用程序时,它都会崩溃,Logcat会说:

原因:java.lang.IollegalArgumentException:ID未引用此活动内的视图

所以我认为这是说找不到ID,但这是我的Java文件和XML文件彼此对应。Java:

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没有引用该活动中的视图。但我清楚地键入了ID:nav_host_fragment。我不知道出了什么问题,当我进入安卓工作室时,它没有报告任何错误。请帮忙。

Navigation.findNavController依赖于findViewById(),它只有在您调用setContentView()之后才能工作,也就是说,实际将视图添加到活动中。

使用适当的控制器来避免ID不引用此"活动"或片段中的视图?

如果您使用的是Java

活动中使用

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

在片段中使用

NavController navController = NavHostFragment.findNavController(this)
// or
NavHostFragment.findNavController(view)

如果您正在使用kotlin

活动中使用

val navController = findNavController(R.id.nav_host_fragment)

在片段中使用

val navController = findNavController()

我认为我们必须在创建视图后使用它。尝试将代码放在onPostCreate中,它运行良好。

注意:它在CreateView 内部不起作用

override fun onPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onPostCreate(savedInstanceState, persistentState)
val navController=findNavController(R.id.navHostFragment)
}

万一有人遇到我的问题。我试图访问导航中的嵌套资源。

代替

val navController = findNavController(R.id.nav_print)

更新到

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

相关内容

最新更新