122

我使用导航库和安全参数来传递数据。我像这样定义片段的参数。

<fragment
        android:id="@+id/otherFragment"
        android:name="com.asd.navigate.OtherFragment"
        android:label="OtherFragment">
        <argument
            android:name="screenTitle"
            android:defaultValue="0"
            app:type="string" />
    </fragment>

生成了 OtherFragmentArgs,我可以使用它,但是单击“制作项目”时不会生成 OtherFragmentDirection 类。是那个错误还是我必须做一些不同的事情。

谢谢你的建议。

buildscript {
    ...
    dependencies {
       ...
        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"

    }
}

构建.gradle

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

在此处输入图像描述

4

27 回答 27

83

查找作为导航源的片段的类。如果您定义从 FragmentA 到 FragmentB 的导航,您将找到 FragmentADirections 类,其中包含您定义的操作(在 nav_graph.xml 中)。

然后,要生成方向类(也是参数类),您需要Project level gradle点击build命令。在这里我附上一个截图,以便清楚地了解。

在此处输入图像描述

于 2018-07-05T19:25:45.700 回答
77

我忘了在文件中应用插件app.gradle,只需添加这一行

apply plugin: "androidx.navigation.safeargs.kotlin"

或者这一行,如果你使用的是 java

apply plugin: "androidx.navigation.safeargs"
于 2020-01-14T11:06:17.457 回答
46

我在使用 android studio 4.2 预览版时遇到了类似的问题。

问题是 IDE 不知何故没有选择插件放置生成的方向类的源文件夹。因此,将以下内容添加到我的 app build.gradle 文件为我解决了这个问题。

sourceSets {
    main {
        java {
            srcDirs += 'build/generated/source/navigation-args'
        }
    }
}

希望这可以帮助!

于 2020-06-25T04:57:36.203 回答
17

正如 Christian 所写,添加 source set do app gradle 文件会有所帮助。对我来说,这个问题出现在 Android Studio 4.1 和 4.2 中。在 Kotlin DSL 中:

android {
    ....
    sourceSets {
        getByName("main").java.srcDirs("build/generated/source/navigation-args")
    }
}
于 2020-06-26T09:31:22.143 回答
14

如果以上所有答案都对您不起作用,并且您仍然遇到未生成方向类的问题。确保您正在寻找正确的方向类

例如,我们必须从 to 传递FragmentA参数FragmentB
在导航图文件中,我们必须在's 标签<argument/>下添加标签。FragmentB这样,我们将获得两个生成的类FragmentBArgsFragmentADirections. 如您所见,创建的方向类使用的FragmentA's name,而不是FragmentB.

因此,请记住,与此问题的用户正在寻找的内容不同,生成的方向类将获得动作起始片段的类名,并附加单词“Directions”。不是目标片段的类名(参数的所有者)。

这是文档中的内容:

为动作发起的每个目的地创建一个类。 此类的名称是始发目的地的名称,附加单词“Directions”。

为接收目的地创建一个类。此类的名称是目的地的名称,附加单词“Args”。

此外,在 action 标签下添加参数标签不会生成方向类。它用于为目标片段的参数提供不同的默认值。

希望这可以帮助!

于 2020-04-26T10:22:04.407 回答
13

如果您已经添加了dependencies > classpath并且apply plugin未应用更改,请确保应用了按顺序更改的项目CleanBuilt

在 Android Studio 中:

  • Build tab > Clean project
  • Build tab > ReBuild project
于 2020-04-06T07:47:07.760 回答
13

我们可以通过在 gradle 中添加以下代码并重建应用程序来解决此问题。在项目 gradle 中添加以下代码。

classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"

在应用程序 gradle 添加以下代码

apply plugin: "androidx.navigation.safeargs"
于 2020-05-15T18:34:51.450 回答
5

对我来说,我意识到我还需要将相同的参数放入 navi_graph.xml 中的接收器片段中,以便生成 Arg 类(已经有方向)。例如:

<fragment android:id="@+id/receiver_fragment" ...>

    <argument android:name="arg_from_sender_fragment".../>

    <argument android:name="arg2_from_sender_fragment".../>

</fragment>
于 2020-04-26T06:50:27.567 回答
5

以下两个步骤对我有用:

  1. 清洁项目。
  2. 重建项目

安卓工作室 4.0 Kotlin 1.3.72

于 2020-06-22T09:47:12.623 回答
3

应用程序-> build.gradle:

在插件中,我添加了以下行来解决该问题:

plugins {
    id "androidx.navigation.safeargs.kotlin"
}
于 2021-06-27T07:07:02.943 回答
2

还要确保使用最新版本。有问题,我有一个 1.X 版本。

// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:2.2.1"
implementation "androidx.navigation:navigation-ui-ktx:2.2.1"

并且 nav.xml 中的参数正确:

<fragment
    android:id="@+id/categoryFragment"
    android:name="com...CategoryFragment"
    android:label="CategoryFragment"
    tools:layout="@layout/fragment_category">
    <action
        android:id="@+id/action_categoryFragment_to_ProductFragment" // /!\
        app:destination="@id/productFragment"
        <argument
            android:name="products"
            android:defaultValue=""
            app:argType="string" />
    </action>
</fragment>

代码:

override fun onItemClicked(category: Category) {
     val action = CategoryFragmentDirections.actionCategoryToProductFragment(products = "myString") // /!\
     view?.findNavController()?.navigate(action)
}
于 2020-03-13T10:52:36.897 回答
2

在您的应用程序/模块级别添加以下依赖项:

    def nav_version = "2.3.0-alpha04"  //your nav_version defined 

    implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

所有的答案也是正确的。只是觉得我应该添加此信息。它对我有用

于 2020-03-19T07:13:58.983 回答
2

就我而言,问题是我在 2 个导航图中使用了具有相同 id 的相同片段。

Android Studio 无法识别其中一个导航图的操作。

所以对我来说解决方案是更改其中一个导航图的 id,重建,再次更改 id 并再次重建

之后一切都恢复正常

于 2020-06-09T02:15:41.377 回答
2

我按照信中的所有说明进行操作,并注意到 Directions 类正在生成,但在代码中调用时不会编译。这发生在使用 Android Studio 4.1 和 4.2 Preview 时。

几个小时后,我决定尝试降级到 4.0 Stable。现在所有问题都消失了,我可以调用 FragmentDirections 并编译它。

我在问题跟踪器中添加了一个错误:https ://issuetracker.google.com/issues/158777967

于 2020-06-11T21:36:41.670 回答
2

如果有人在使用 SafeArgs 自动生成类时遇到问题,请检查您的 AndroidStudio 版本。我正在使用 4.1 测试版(此时),当降级到 4.0 时它运行良好。一定要试试。干杯!

于 2020-06-25T00:46:23.253 回答
2

花了一点时间弄清楚,但您需要在导航 xml 文件中同时生成操作和参数来生成两者。

<fragment
    android:id="@+id/nav_someId"
    android:name=".CategoriesFragment"
    android:label="@string/someName"
    tools:layout="@layout/fragment_categories">
    <argument
        android:name="@string/category"
        android:defaultValue="0"
        app:argType="string" />
    <action
        android:id="@+id/startCategoriesFragment"
        app:destination="@+id/categoriesFragment">
        <argument
            android:name="@string/category"
            android:defaultValue="0"
            app:argType="string" />
    </action>
</fragment>
于 2020-08-04T12:11:17.213 回答
2

就我而言,缺少的部分首先在build.gradle.kts

buildscript {
repositories {
    google()
}
dependencies {
    def nav_version = "X.X.X" // Use the latest version
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}

}

然后,我必须在应用程序导航模块中添加插件(我通常将导航分开在不同的模块中):

apply plugin: "androidx.navigation.safeargs.kotlin"

Clean -> Build 但仍然必须手动添加操作的路径

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment
于 2020-08-27T16:13:20.487 回答
2

按着这些次序:

第一步:添加依赖

def nav_version = "2.3.2"

implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

第 2 步:在您的应用程序级别build.gradle确保您添加了以下插件。

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'kotlin-android-extensions'
    id 'androidx.navigation.safeargs.kotlin'
}

build.gradle第 3 步:将其添加到依赖项部分的 project_level中:

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2"

第 4 步:nav_graph.xml确保将一个片段连接到另一个片段actions

第 5 步:清理并重建您的项目。

于 2020-12-28T16:18:01.457 回答
1

我只是忘记在清理项目后重建我的项目:)

也不要忘记这两个步骤:

  1. 向项目 Gradle 文件添加安全参数依赖项
"android.arch.navigation:navigation-safe-args-gradle-plugin:$version_navigation"
  1. 将 safeargs 插件添加到 app Gradle 文件 // 为 safeargs 添加应用插件语句
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'
于 2021-04-23T20:45:06.553 回答
1

如果其他答案都不适合您并且您正在使用多个 NavGraph,请确保您在 xml 中的 NavGraph id 不同。

<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">
于 2021-11-30T10:40:54.790 回答
0

问题可能出在你apply plugin的东西上,请检查你是否使用 java 然后添加:

apply plugin: "androidx.navigation.safeargs"

对于 kotlin 使用这个:

apply plugin: "androidx.navigation.safeargs.kotlin"
于 2020-11-17T05:56:17.630 回答
0

就我而言,我手动添加了参数......在错误的地方 ‍♂️</p>

在导航图中选择目的地,然后单击“参数”旁边的“+”按钮。添加相关信息,您应该能够通过 navArgs() 看到生成的 SafeArgs。

这是一个有用的图片指南。 https://medium.com/androiddevelopers/navigating-with-safeargs-bf26c17b1269

于 2021-01-10T08:31:47.603 回答
0

在我的例子中,我没有从 Fragment A 到 B 的控制拖动,而是将 B 到 A,因此它们没有在正确的 Fragment 类中生成,新手错误!所以也检查一下吧!

于 2021-02-21T12:44:51.283 回答
0

当您更新导航图上的某些操作或参数时。您需要 Build > Rebuild Project 才能看到此更改已应用

于 2021-03-31T08:41:27.510 回答
0

出于某种原因(我仍在学习 Android 中 gradle 文件的详细信息),上述插件行不起作用。但这确实做到了。在build.gradle (app)plugin的部分中添加这一行。

id ("androidx.navigation.safeargs")

没有冒号,没有等号。当然还有同步、重建等。这与其他答案略有不同。但是细节在编程中很重要!

于 2021-06-07T04:15:51.507 回答
0

所有解决方案都对我不起作用,我已经在 build.gradle 中同步了。我能找到方向和参数的唯一方法是从 Android 更改为 Project。打开应用程序 -> 包 -> 构建 -> 生成 -> 源 -> 导航参数。你会得到片段方向和参数。这是截图,希望对你们有用!

片段方向和参数

在此处输入图像描述

于 2021-07-16T11:35:06.503 回答
0

在 build.gradle 中应用插件(模块级别)

应用插件:“androidx.navigation.safeargs.kotlin”

在 build.grade(项目级别)中添加依赖项

类路径“androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-rc01”

这将解决问题,它对我有用。

于 2021-12-15T03:08:49.697 回答