首页 > 解决方案 > 导航在导航抽屉android中不起作用

问题描述

我是android开发的新手,我已经被困了好几天了。如屏幕截图所示,我使用 android studio 默认 Navigation Drawer Activity 模板创建了一个新的 android 项目。我的要求是我想获得一个 NavController 的实例,以便我可以在单击回收器视图中的项目时从主片段导航/推送到另一个片段。我使用了由 android studio 生成的相同默认代码,而我这边没有任何更改。试图获取 NavController 的实例,但应用程序在 HomeFragmnet 中在线崩溃:

navController = requireActivity().findNavController(R.id.nav_host_fragment_content_main)

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            navController = requireActivity().findNavController(R.id.nav_host_fragment_content_main)
        }

是的 nav_host_fragment_content_main 在content_main.xml中可用

我想导航到另一个片段,如下面的代码:

  private fun itemClicked(article: Article?) {
        val args = Bundle()
        args.putString("title", article?.title)
        navController.navigate(R.id.navigation_news_detail, args, NavAnimate.provideNavOptions().build())
    }

项目创建截图

在此处输入图像描述

崩溃错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testnavigation, PID: 15256
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testnavigation/com.example.testnavigation.MainActivity}: android.view.InflateException: Binary XML file line #15 in com.example.testnavigation:layout/activity_main: Binary XML file line #19 in com.example.testnavigation:layout/content_main: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.view.InflateException: Binary XML file line #15 in com.example.testnavigation:layout/activity_main: Binary XML file line #19 in com.example.testnavigation:layout/content_main: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #19 in com.example.testnavigation:layout/content_main: Error inflating class fragment
     Caused by: java.lang.IllegalArgumentException: ID does not reference a View inside this Activity
        at android.app.Activity.requireViewById(Activity.java:3375)
        at androidx.core.app.ActivityCompat.requireViewById(ActivityCompat.java:366)
        at androidx.navigation.Navigation.findNavController(Navigation.java:58)
        at androidx.navigation.ActivityKt.findNavController(Activity.kt:30)
        at com.example.testnavigation.ui.home.HomeFragment.onViewCreated(HomeFragment.kt:45)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
        at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:281)
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298)
        at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1067)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:995)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1261)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1117)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1261)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1117)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
        at com.example.testnavigation.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:52)
        at com.example.testnavigation.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:46)
        at com.example.testnavigation.MainActivity.onCreate(MainActivity.kt:26)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

崩溃有点说“ID 没有引用此活动中的视图”。我一直在努力寻找解决方案和不同的东西,但根本没有成功。

我的 android studio 版本是 Mac 中的 4.2.2。

任何帮助都是非常可观的。

标签: androidkotlinnavigation

解决方案


2021 年 7 月 16 日 14:39编辑:

navController = findNavController(R.id.nav_host_fragment_content_main)在您的活动中使用而不是在片段中使用并将其公开。在您的片段中执行此操作以获取 navController:(activity as YourActivity)!!.navController

旧答案:

关键就在这里:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testnavigation/com.example.testnavigation.MainActivity}: android.view.InflateException: Binary XML file line #15 in com.example.testnavigation:layout/activity_main: Binary XML file line #19 in com.example.testnavigation:layout/content_main: Error inflating class fragment 错误表明您正在尝试将片段膨胀到不存在的容器中。这是一个常见的 NavigationUI 错误,很容易修复:

  • 检查您的 ../app/res/navigation/your_nav_graph 是否存在 navigation_id(如下所示:

    <fragment android:id="@+id/a" android:name="com.example.myapplication.FragmentA" android:label="a" tools:layout="@layout/a"> <action android:id= "@+id/ action_a_to_b " app:destination="@id/b" app:enterAnim="@anim/nav_default_enter_anim" app:exitAnim="@anim/nav_default_exit_anim" app:popEnterAnim="@anim/nav_default_pop_enter_anim" app:popExitAnim ="@anim/nav_default_pop_exit_anim"/> </fragment>

您应该传入action_a_to_bID在哪里,navController.navigate(而不是 fragment_container 的 ID。

看看官方文档:导航到一个目的地,如果它还不存在,如何创建一个动作/导航到目的地。


推荐阅读