繁体   English   中英

IllegalArgumentException:无法从当前目的地找到导航操作/目的地包名/action_xxx

[英]IllegalArgumentException: Navigation action/destination packagename/action_xxx cannot be found from the current destination

当我尝试在 viewpager 中从一个 Fragment 导航到另一个 Fragment 时,我遇到了 Android 导航架构组件的问题,出现此错误:

java.lang.IllegalArgumentException: Navigation action/destination 
com.gigaweb.mysales:id/action_mainFragment_to_addTransactionFragment cannot be found from the current 
destination Destination(com.gigaweb.mysales:id/pagerFragment) label=fragment_pager class=com.gigaweb.mysales.PagerFragment

我有一个 viewpager,我用它在两个 Fragment 之间导航,它工作得很好。 问题是我在其中一个片段中有一个按钮,该按钮还用于使用导航控制器导航到另一个片段,当单击该按钮时,应用程序崩溃并出现上述错误。

下面是错误截图

更新这是导航图

如您所见,SignIn Fragment 是起始目的地,并且有一个动作喜欢它作为 ViewPager 的宿主的 pagerFragment

我希望应用程序的工作方式是:

  1. 当应用程序启动时显示登录片段......工作

  2. 单击登录按钮时导航到 PagerFragment ..... 工作

  3. 通过向左或向右滑动,在 MainFragment 和 AdminFragment 之间导航..... 工作

  4. 单击 FAB 按钮后导航到 AddTransactionFragment .....不工作!! 单击按钮时,应用程序崩溃。

更新这里是导航图的 XML 代码

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/signInFragment">

<fragment
    android:id="@+id/signInFragment"
    android:name="com.gigaweb.mysales.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_pagerFragment"
        app:destination="@id/pagerFragment" />
</fragment>
<fragment
    android:id="@+id/addTransactionFragment"
    android:name="com.gigaweb.mysales.AddTransactionFragment"
    android:label="AddTransactionFragment" >
    <action
        android:id="@+id/action_addTransactionFragment_to_mainFragment"
        app:destination="@id/mainFragment" />
</fragment>
<fragment
    android:id="@+id/mainFragment"
    android:name="com.gigaweb.mysales.MainFragment"
    android:label="MainFragment" >
    <action
        android:id="@+id/action_mainFragment_to_addTransactionFragment"
        app:destination="@id/addTransactionFragment" />
</fragment>
<fragment
    android:id="@+id/adminFragment"
    android:name="com.gigaweb.mysales.AdminFragment"
    android:label="AdminFragment" />
<fragment
    android:id="@+id/pagerFragment"
    android:name="com.gigaweb.mysales.PagerFragment"
    android:label="fragment_pager"
    tools:layout="@layout/fragment_pager" />
</navigation>

在此处输入图片说明

如果您不navigate()MainFragmentAdminFragment ,您将停留在您导航到的最后一个目的地: PagerFragment ,这是预期的行为。 NavController 对子片段(例如 PagerFragment 的PagerFragment片段) PagerFragment ,因此您从未将MainFragment作为目的地。

如果您从不navigate()MainFragmentAdminFragment并且它们仅作为 ViewPager 的一部分可见,则MainFragmentAdminFragment不应出现在您的图表中。 PagerFragment的 ViewPager 中的片段的任何操作都应该是直接对PagerFragment (您实际所在的目的地)进行的操作。

对于我的情况,我通过替换来解决问题 -

 <action
        android:id="@+id/action_mainFragment_to_addTransactionFragment"
        app:destination="@id/addTransactionFragment" />

 <action
            android:id="@+id/action_mainFragment_to_addTransactionFragment"
            app:popUpToInclusive="true" /* If true then also remove the destination from stack while popup */
            app:popUpTo="@id/mainFragmen"  /*The fragment where to land again from destination*/
            app:destination="@id/addTransactionFragment" />

就我而言,事实证明它是由调用dismissAllowingStateLoss();引起的dismissAllowingStateLoss(); 导航到新目的地后。

暂无
暂无

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

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