简体   繁体   English

导航无法在导航抽屉 android 中使用

[英]Navigation not working with in Navigation Drawer android

I am new to android development and I have been stuck for days.我是 android 开发的新手,我已经被困了好几天。 I created a new android project with the android studio default Navigation Drawer Activity template as seen on the screenshot.如屏幕截图所示,我使用 android studio 默认导航抽屉活动模板创建了一个新的 android 项目。 My requirement is I wanted to get an instance of NavController so that I can navigate/push to another fragment from the home fragment on click of items in recycler view.我的要求是我想获得 NavController 的一个实例,以便我可以在回收器视图中单击项目时从主片段导航/推送到另一个片段。 I have used the same default code generated by an android studio with no changes from my side.我使用了由 android studio 生成的相同默认代码,我这边没有任何更改。 Tried to get the instance of NavController but the app crashes on the line in HomeFragmnet:试图获取 NavController 的实例,但应用程序在 HomeFragmnet 中崩溃:

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

in

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

and yes nav_host_fragment_content_main is available in content_main.xml是的 nav_host_fragment_content_main 在content_main.xml 中可用

I wanted to navigate to another fragment as in following code:我想导航到另一个片段,如下面的代码所示:

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

Project Create screenshot项目创建截图

在此处输入图片说明

The crash error Logs:崩溃错误日志:

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)

Somewhat the crash says "ID does not reference a View inside this Activity".有点崩溃说“ID 没有引用此活动中的视图”。 I have been trying to find the solution and different things but no success at all.我一直试图找到解决方案和不同的东西,但根本没有成功。

My android studio version is 4.2.2 in Mac.我的 android studio 版本在 Mac 上是 4.2.2。

Any help is highly appreciable.任何帮助都是非常可观的。

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

use navController = findNavController(R.id.nav_host_fragment_content_main) in your activity rather than in fragment and make it public.在您的活动中而不是在片段中使用navController = findNavController(R.id.nav_host_fragment_content_main)并将其公开。 In your fragment do this to get the navController: (activity as YourActivity)!!.navController在您的片段中执行此操作以获得 navController: (activity as YourActivity)!!.navController

old answer :旧答案:

the key is here: 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 the error says you are trying to inflate a fragment into a container that does not exist.关键在这里: 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该错误表示您正在尝试将片段膨胀到不存在的容器中。 This is a common NavigationUI error, and it's easy to fix:这是一个常见的 NavigationUI 错误,很容易修复:

  • check in your ../app/res/navigation/your_nav_graph that the navigation_id exist (like so:检查您的 ../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> <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>

where action_a_to_b is the ID you should pass in navController.navigate( not the id of the fragment_container.其中action_a_to_b是您应该在navController.navigate(传递的ID navController.navigate(而不是 fragment_container 的 ID。

take a look at the official doc : Navigate to a destination in how to create an action / navigation to destination if it does not exist yet .看一看官方文档: 导航到目的地了解如何创建操作/导航到目的地(如果尚不存在)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM