【问题标题】:action cannot be found from the current destination无法从当前目的地找到操作
【发布时间】:2021-04-10 08:16:28
【问题描述】:

我的导航非常简单,当我尝试转到新片段时出现此错误:

java.lang.IllegalArgumentException: Navigation action/destination com.my.app:id/action_settingsFragment_to_profileFragment cannot be found from the current destination Destination(com.my.app:id/mainFragment) label=fragment_main class=com.my.app.main.MainFragment

navigation

<?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/main_graphs"
    app:startDestination="@id/mainFragment">
    <fragment
        android:id="@+id/mainFragment"
        android:name="com.my.app.main.MainFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main" >
        <action
            android:id="@+id/action_mainFragment_to_laundriesFragment"
            app:destination="@id/laundriesFragment" />
    </fragment>
    <!-- other fragments here...  -->
    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.my.app.main.SettingsFragment"
        android:label="fragment_settings"
        tools:layout="@layout/fragment_settings" >
        <action
            android:id="@+id/action_settingsFragment_to_newOrderFragment"
            app:destination="@id/newOrderFragment" />
        <action
            android:id="@+id/action_settingsFragment_to_profileFragment"
            app:destination="@id/profileFragment" />
    </fragment>
    <fragment
        android:id="@+id/profileFragment"
        android:name="com.my.app.main.ProfileFragment"
        android:label="fragment_profile"
        tools:layout="@layout/fragment_profile" >
    </fragment>
</navigation>

SettingsFragment.kt(重定向代码)

when (position) {
    0 -> {
        //....
    }
    1 -> {
        navController.navigate(R.id.action_settingsFragment_to_profileFragment)
    }
    2 -> {
        //...
    }
}

有什么想法吗?

更新

我已经设法使用以下代码重定向到 profileFragment,但是当我点击返回按钮时,它会关闭应用程序而不是返回到 settingsFragment

private fun GenerateItems(){
    when (position) {
        0 -> {
            //
        }
        1 -> {
            this@SettingsFragment.navigateTo(ProfileFragment())
        }
        2 -> {
            //
        }
    }
}

private fun navigateTo(fragment: Fragment) {
    val transaction =  (activity as FragmentActivity).supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragmentFragmentId, fragment)

    transaction.commit()
}

关于后退按钮问题的任何想法?

【问题讨论】:

  • 你有没有用行动尝试过,使用方向?
  • @Eyosiyas 你是什么意思?
  • 你用来传递数据或参数的那个。
  • NavDirections action = SpecifyAmountFragmentDirections .actionSpecifyAmountFragmentToConfirmationFragment(); Navigation.findNavController(view).navigate(action);
  • @Eyosiyas 不确定我是否理解正确,但我也有类似的情况override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) navController = Navigation.findNavController(view) }

标签: android kotlin android-navigation


【解决方案1】:

java.lang.IllegalArgumentException:无法从当前目标 Destination(com.my.app:id/mainFragment) label=fragment_main class=com.my 找到导航操作/目标 com.my.app:id/action_settingsFragment_to_profileFragment。 app.main.MainFragment

异常意味着您正在尝试使用名为 action_settingsFragment_to_profileFragment 的操作,但在当前目标/片段 MainFragment 中找不到该操作

顾名思义:这是一个用于从settingsFragment 移动到profileFragment 的操作,因此只能在settingsFragment 内使用此操作。

注意:自动生成的动作名称只是源和目标的指示,但如果命名混乱,它可能意味着其他东西。

在 navGraph 中确认:

<fragment
    android:id="@+id/settingsFragment"
    android:name="com.my.app.main.SettingsFragment"
    android:label="fragment_settings"
    tools:layout="@layout/fragment_settings" >
    <action
        android:id="@+id/action_settingsFragment_to_newOrderFragment"
        app:destination="@id/newOrderFragment" />
    <action
        android:id="@+id/action_settingsFragment_to_profileFragment"
        app:destination="@id/profileFragment" />
</fragment>

navGraph 的这一部分是当你在 settingsFragment 时,有两个动作可以从settingsFragmentnewOrderFragment 片段或者到profileFragment;甚至弹出backstack返回上一个fragment

如果您真的想从MainFragment 转到SettingFragment,那么您需要在MainFragment 中创建一个新操作,因为那里没有人,如下所示

<fragment
    android:id="@+id/mainFragment"
    android:name="com.my.app.main.MainFragment"
    android:label="fragment_main"
    tools:layout="@layout/fragment_main" >

    <action
        android:id="@+id/action_mainFragment_to_laundriesFragment"
        app:destination="@id/laundriesFragment" />

    <action
        android:id="@+id/action_mainFragment_to_settingsFragment"
        app:destination="@id/settingsFragment" />
</fragment>

更新:

我已经设法使用以下代码重定向到profileFragment,但是当我点击返回按钮时,它会关闭应用程序而不是返回到settingsFragment

您需要添加app:popUpTo="@id/settingsFragment" 并指定当您单击返回或父按钮时希望返回堆栈弹出的片段

<fragment
    android:id="@+id/settingsFragment"
    android:name="com.my.app.main.SettingsFragment"
    android:label="fragment_settings"
    tools:layout="@layout/fragment_settings" >
    <action
        android:id="@+id/action_settingsFragment_to_newOrderFragment"
        app:destination="@id/newOrderFragment" />
    <action
        android:id="@+id/action_settingsFragment_to_profileFragment"
        app:popUpTo="@id/settingsFragment"
        app:destination="@id/profileFragment" />
</fragment>

要使用生成的方向类: dd apply plugin: "androidx.navigation.safeargs" 插件到 gradle 模块级别

将类路径添加到gradle app level:

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.3.5"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

然后Build &gt; Make project生成方向类。并在导航中使用生成的类

navController.navigate(SettingsFragmentDirections.actionSettingsFragmentToProfileFragment())

也可以check documentation 了解更多信息

【讨论】:

  • 所以你的意思是为了我的导航工作我需要在我的主要片段中添加action_mainFragment_to_settingsFragment 对吗?
  • 是的.. 如果你想从 mainFragment 转到 settingFragment。并使用 navController 以编程方式对某些操作执行导航
  • MainFragment 转到settingsFragment 不是我的问题,我的问题是从settingsFragment 转到ProfileFragment PS: 我刚刚试过你的建议仍然得到同样的错误
  • 我已经添加了截图。
  • 你是从 settingsFragment 类做的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2021-10-15
相关资源
最近更新 更多