IllegalArgumentException:无法从当前目的地找到导航 action/destination packagename/action_xxx
IllegalArgumentException: Navigation action/destination packagename/action_xxx cannot be found from the current destination
当我尝试在 viewpager 中从一个片段导航到另一个片段时,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,我用它在两个片段之间导航,它工作得很好。问题是我在其中一个片段中有一个按钮,该按钮还用于使用 navcontroller 导航到另一个片段,当单击该按钮时,应用程序崩溃并且出现上述错误。
更新 这是导航图
如您所见,SignIn Fragment 是起始目标,并且有一个操作喜欢它作为 ViewPager 的主机的 pagerFragment
我希望应用程序的工作方式是:
应用程序启动时显示登录片段......正在运行
单击登录按钮时导航到 PagerFragment ..... 工作
通过向左或向右滑动在 MainFragment 和 AdminFragment 之间导航..... 正在工作
单击 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()
到 MainFragment
和 AdminFragment
,您将停留在您导航到的最后一个目的地:PagerFragment
,这是预期的行为。 NavController 对子片段一无所知,例如 PagerFragment
的 ViewPager 中的片段,因此您从未将 MainFragment
作为目的地。
如果您从不 navigate()
到 MainFragment
或 AdminFragment
并且它们只能作为您的 ViewPager 的一部分查看,那么 MainFragment
和 AdminFragment
不应该在你的图表中。 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/mainFragment" /*The fragment where to land again from destination*/
app:destination="@id/addTransactionFragment" />
就我而言,事实证明这是导航到新目的地后调用 dismissAllowingStateLoss();
造成的。
当我尝试在 viewpager 中从一个片段导航到另一个片段时,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,我用它在两个片段之间导航,它工作得很好。问题是我在其中一个片段中有一个按钮,该按钮还用于使用 navcontroller 导航到另一个片段,当单击该按钮时,应用程序崩溃并且出现上述错误。
更新 这是导航图
如您所见,SignIn Fragment 是起始目标,并且有一个操作喜欢它作为 ViewPager 的主机的 pagerFragment
我希望应用程序的工作方式是:
应用程序启动时显示登录片段......正在运行
单击登录按钮时导航到 PagerFragment ..... 工作
通过向左或向右滑动在 MainFragment 和 AdminFragment 之间导航..... 正在工作
单击 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()
到 MainFragment
和 AdminFragment
,您将停留在您导航到的最后一个目的地:PagerFragment
,这是预期的行为。 NavController 对子片段一无所知,例如 PagerFragment
的 ViewPager 中的片段,因此您从未将 MainFragment
作为目的地。
如果您从不 navigate()
到 MainFragment
或 AdminFragment
并且它们只能作为您的 ViewPager 的一部分查看,那么 MainFragment
和 AdminFragment
不应该在你的图表中。 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/mainFragment" /*The fragment where to land again from destination*/
app:destination="@id/addTransactionFragment" />
就我而言,事实证明这是导航到新目的地后调用 dismissAllowingStateLoss();
造成的。