非法参数异常:从当前目的地无法找到导航动作/目的地。目的地[导航错误]。

7

我对导航图和导航组件都比较陌生,现在我想从位于“PrivSectionFragment”中的RecyclerView向“PrivSectionDetailFragment”传递数据。不幸的是,每当我运行应用程序时,我的日志中都会出现这个错误。

 java.lang.IllegalArgumentException: Navigation action/destination com.gazelle.wadifatk:id/action_privSectionFragment_to_privsDetailFragment cannot be found from the current destination Destination(com.gazelle.wadifatk:id/jobsFragment) label=الوظائف class=com.gazelle.wadifatk.jobLists.jobsFragment
    at androidx.navigation.NavController.navigate(NavController.java:940)
    at androidx.navigation.NavController.navigate(NavController.java:877)
    at androidx.navigation.NavController.navigate(NavController.java:863)
    at androidx.navigation.NavController.navigate(NavController.java:1159)
    at com.gazelle.wadifatk.jobLists.PrivListAdapter.onBindViewHolder$lambda-0(PrivListAdapter.kt:55)

这里它所指的是// 它指的是我的回收器适配器

PushDownAnim.setPushDownAnimTo(holder.card_view)
        //.setScale(PushDownAnim.MODE_SCALE, 0.89f)
        .setOnClickListener {
            val sendData = PrivSectionFragmentDirections
                .actionPrivSectionFragmentToPrivsDetailFragment(priv_list[position])
            Navigation.findNavController(view).navigate(sendData)
        }

这是我的 my_nav.xml 文件 // 蓝色圆圈 my_nav 照片

请记住,我能够通过相同的方法从“LatestNewsFragment”传递数据到“NewsDetailsFragment”,但我不知道为什么它接受了这些片段之间的数据传递,而没有接受从“PrivSectionFragment”到“PrivSectionDetailFragment”的数据。

以下是这些片段的代码

<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/my_nav"
app:startDestination="@id/latestNewsFragment">

<fragment
    android:id="@+id/latestNewsFragment"
    android:name="com.gazelle.wadifatk.newsList.LatestNewsFragment"
    android:label="اخر الاخبار"
    tools:layout="@layout/fragment_latest_news" >
    <action
        android:id="@+id/action_latestNewsFragment_to_jobsFragment"
        app:destination="@id/jobsFragment"
        app:enterAnim="@anim/nav_default_enter_anim"
        app:exitAnim="@anim/nav_default_exit_anim" />
    <action
        android:id="@+id/action_latestNewsFragment_to_newsDetailFragment"
        app:destination="@id/newsDetailFragment"
        app:enterAnim="@android:anim/slide_in_left"
        app:exitAnim="@android:anim/slide_out_right"
        app:popEnterAnim="@android:anim/slide_in_left"
        app:popExitAnim="@android:anim/slide_out_right" />
</fragment>
<fragment
    android:id="@+id/jobsFragment"
    android:name="com.gazelle.wadifatk.jobLists.jobsFragment"
    android:label="الوظائف"
    tools:layout="@layout/fragment_jobs" >
    <action
        android:id="@+id/action_jobsFragment_to_govSectionFragment"
        app:destination="@id/govSectionFragment" />
    <action
        android:id="@+id/action_jobsFragment_to_privSectionFragment2"
        app:destination="@id/privSectionFragment" />
    <action
        android:id="@+id/action_jobsFragment_to_latestNewsFragment"
        app:destination="@id/latestNewsFragment" />
</fragment>
<fragment
    android:id="@+id/privSectionFragment"
    android:name="com.gazelle.wadifatk.jobLists.PrivSectionFragment"
    android:label="PrivSectionFragment" >
    <action
        android:id="@+id/action_privSectionFragment_to_privsDetailFragment"
        app:destination="@id/privsDetailFragment"
        app:enterAnim="@anim/nav_default_enter_anim"
        app:exitAnim="@anim/nav_default_exit_anim" />
    <action
        android:id="@+id/action_privSectionFragment_to_jobsFragment"
        app:destination="@id/jobsFragment" />
</fragment>
<fragment
    android:id="@+id/newsDetailFragment"
    android:name="com.gazelle.wadifatk.newsList.NewsDetailFragment"
    android:label="التفاصيل"
    tools:layout="@layout/fragment_news_detail">
    <action
        android:id="@+id/action_newsDetailFragment_to_latestNewsFragment"
        app:destination="@id/latestNewsFragment"
        app:enterAnim="@android:anim/slide_in_left"
        app:exitAnim="@android:anim/slide_out_right"
        app:popEnterAnim="@android:anim/slide_in_left"
        app:popExitAnim="@android:anim/slide_out_right" />
    <argument
        android:name="news_data_list"
        app:argType="com.gazelle.wadifatk.newsList.NewsListViewModel" />

</fragment>

 <fragment
    android:id="@+id/privsDetailFragment"
    android:name="com.gazelle.wadifatk.jobLists.PrivsDetailFragment"
    android:label="التفاصيل"
    tools:layout="@layout/fragment_privs_detail" >

    <argument
        android:name="priv_data_list"
        app:argType="com.gazelle.wadifatk.jobLists.PrivListViewModel" />
    <action
        android:id="@+id/action_privsDetailFragment_to_privSectionFragment"
        app:destination="@id/privSectionFragment" />

</fragment>

这是jobsFragment()的屏幕截图:

enter image description here


根据错误提示,您正在jobsFragment中,而导航正在被触发。 - Arpit Shukla
@Arpit Shukla 我正在使用TabLayout,因此jobsFragments包含具有TabLayout和privsectionfragment作为选项卡之一的ViewPager。 - Abood
那么你不应该将 PrivSectionFragment 放在导航图中。使用 jobsFragments 导航到 NewsDetailFragment - Arpit Shukla
我指的是你应用程序的屏幕截图(而不是导航图)。privSectionFragment是jobsFragment中的一个选项卡。我们为什么需要在这里添加返回按钮? - Arpit Shukla
你的返回按钮在哪里?我在PrivSectionfragment中没有看到任何返回按钮。 - Arpit Shukla
显示剩余9条评论
3个回答

4

你只需要在导航图中添加JobsFragment,并为这个片段添加PrivsDetailFragment的动作。

<fragment
    android:id="@+id/jobsFragment"
    android:name="com.gazelle.wadifatk.jobLists.jobsFragment"
    android:label="الوظائف"
    tools:layout="@layout/fragment_jobs" >
    <action
        android:id="@+id/action_jobsFragment_to_govSectionFragment"
        app:destination="@id/govSectionFragment" />
    <action
        android:id="@+id/action_jobsFragment_to_latestNewsFragment"
        app:destination="@id/latestNewsFragment" />
    <action
        android:id="@+id/action_jobsFragment_to_privsDetailFragment"
        app:destination="@id/privsDetailFragment"
        app:enterAnim="@anim/nav_default_enter_anim"
        app:exitAnim="@anim/nav_default_exit_anim" />
</fragment>

然后在您的适配器中使用此操作:

PushDownAnim.setPushDownAnimTo(holder.card_view)
        //.setScale(PushDownAnim.MODE_SCALE, 0.89f)
        .setOnClickListener {
            val sendData = JobFragmentDirections.actionJobFragmentToPrivsDetailFragment(priv_list[position])
            Navigation.findNavController(view).navigate(sendData)
        }

您可以从导航图中删除 privSectionFragment

1

验证您的目标是否需要参数,如果是,则可以在您的操作中添加。

    PushDownAnim.setPushDownAnimTo(holder.card_view)
        //.setScale(PushDownAnim.MODE_SCALE, 0.89f)
        .setOnClickListener {
            val sendData = PrivSectionFragmentDirections

    sendData.setNameExtra(valueExtra)
                .actionPrivSectionFragmentToPrivsDetailFragment(priv_list[position])
            Navigation.findNavController(view).navigate(sendData)
        }

0
在我的情况下,我只是使用了错误的方向。
findNavController().navigate(XFragmentDirections.toSomething)

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