android - 导航在导航抽屉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。
任何帮助都是非常可观的。
解决方案
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_b
的ID在哪里,navController.navigate(
而不是 fragment_container 的 ID。
看看官方文档:导航到一个目的地,如果它还不存在,如何创建一个动作/导航到目的地。
推荐阅读
- css - 跨浏览器 CSS 掩码
- postgresql - 无法从 python 脚本和命令行连接到数据库,但可以连接到 PGadmin - 致命:用户“postgres”的身份验证失败
- php - 循环使用多个电话号码和电子邮件的数据库 mysql php
- javascript - 制表器网格标题不按字段唯一获取
- mysql - 如何选择另一个表中没有链接记录为空的记录?
- android - 如何尊重 RecyclerView 项目内的视图大小
- visual-studio - .NET 5.0 preview 7 输出文件位置自动添加文件夹“net50”
- amazon-web-services - 调用使用 Greengrass Core 部署的长寿 lambda 函数的最佳方式?
- javascript - Owl Carousel 2 和 Featherlight.js – mouseDrag 导致灯箱打开
- c# - 如何在使用 NewtonSoft 反序列化对象时使用 JProperty Name 属性?