猿问

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

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


引起原因:java.lang.IllegalArgumentException:ID 未引用此 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 内的视图。但我明明输入了ID:nav_host_fragment。我不知道出了什么问题,当我进入 Android Studio 时,它没有报告任何错误。请帮忙。


慕无忌1623718
浏览 130回答 4
4回答

jeck猫

Navigation.findNavController依赖于findViewById(),它仅在您调用后才起作用setContentView()- 即,实际上将您的视图添加到您的活动中。

慕慕森

使用适当的控制器来避免 ID 不引用此 Activity 或片段内的视图?如果您使用的是 Java在活动中使用NavController&nbsp;navController&nbsp;=&nbsp;Navigation.findNavController(this,&nbsp;R.id.nav_host_fragment)在片段中使用NavController&nbsp;navController&nbsp;=&nbsp;NavHostFragment.findNavController(this) //&nbsp;or NavHostFragment.findNavController(view)如果你正在使用 kotlin在活动中使用val&nbsp;navController&nbsp;=&nbsp;findNavController(R.id.nav_host_fragment)在片段中使用val&nbsp;navController&nbsp;=&nbsp;findNavController()

HUH函数

我认为一旦创建了视图我们就必须使用它。尝试将代码放入 onPostCreate 中,效果很好。注意:它在 onCreateView 中不起作用override fun onPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {&nbsp; &nbsp; super.onPostCreate(savedInstanceState, persistentState)&nbsp; &nbsp; val navController=findNavController(R.id.navHostFragment)}我认为一旦创建了视图我们就必须使用它。尝试将代码放入 onPostCreate 中,效果很好。注意:它在 onCreateView 中不起作用override fun onPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {&nbsp; &nbsp; super.onPostCreate(savedInstanceState, persistentState)&nbsp; &nbsp; 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)
随时随地看视频慕课网APP

相关分类

Java
我要回答