每次我启动应用程序时,它都会崩溃,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)