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

4
我在使用Android Navigation Architecture组件时遇到了问题,当我尝试在一个viewpager中从一个Fragment导航到另一个Fragment时,出现了以下错误:
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之间进行导航,它运行良好。问题是,其中一个Fragment中有一个按钮,该按钮也用于使用NavController导航到另一个Fragment,但当单击该按钮时,应用程序崩溃并出现上述错误。

Below is the screenshot of the error

更新 这是导航图

您可以看到SignIn Fragment是起始目的地,有一个将其连接到作为ViewPager主机的PagerFragment的操作

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

  1. 启动应用程序时,显示SignIn Fragment ..... 正在工作

  2. 单击SignIn按钮后导航到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>

enter image description here


那么,在<fragment android:id="@+id/pagerFragment"的目标中,是否有一个名为action_mainFragment_to_addTransactionFragment<action>元素?因为当该onClick触发时,您正在该目标上。请展示您的导航图以及这些目标与您的ViewPager之间的关系。 - ianhanniballake
@ianhanniballake 是的,你提到的上述操作就是由按钮点击触发的操作。我在我的更新中添加了导航图的截图。 - afhamu
请在您的问题中包含实际的导航XML文件,而不仅仅是设计界面的截图。 - ianhanniballake
@ianhanniballake 好的 - afhamu
3个回答

9

如果你没有使用navigate()方法导航到MainFragmentAdminFragment,那么你将停留在上一个你导航到的目的地:PagerFragment,这是期望的行为。NavController并不知道诸如PagerFragment中ViewPager内的子片段(fragment),因此你从未作为一个目的地来到过MainFragment

如果你从未通过navigate()方法导航到MainFragmentAdminFragment,而它们只作为你的ViewPager的一部分可见,那么MainFragmentAdminFragment就不应该成为你导航图中的一部分。从PagerFragment的ViewPager内的片段发出的任何操作都应该直接作用于PagerFragment(实际上你正在访问的目的地)。


我明白了。但是我是否可以在ViewPager的子片段之间导航? - afhamu
ViewPager确实允许您调用setCurrentItem(indexOfThePageYouWantToGoTo),但这与导航组件无关。这与导航到您的AddTransactionFragment有什么关系? - ianhanniballake
问题在于我希望导航发生在按钮点击时,而AddTransactionFragment不是ViewPager的子级。 - afhamu
只要你触发的操作在你当前所在的“PagerFragment”上,从ViewPager的任何子片段导航到“AddTransactionFragment”都是完全可以的。 - ianhanniballake

0
对我的情况来说,事实证明是因为在导航到新目标后调用了 dismissAllowingStateLoss();

0

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

 <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/mainFragment"  /*The fragment where to land again from destination*/
            app:destination="@id/addTransactionFragment" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接