Die Safeargs-Bibliothek generiert keine Richtungsklasse

76

Ich benutze Navigationsbibliothek und Safeargs zum Übergeben von Daten. Ich definiere Argumente, um so zu fragmentieren.

<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 generiert, ich kann es verwenden, aber die OtherFragmentDirection-Klasse wird nicht generiert, wenn ich auf "Projekt erstellen" klicke. Ist das ein Fehler oder muss ich etwas anderes machen.

Danke für den Rat.

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

    }
}

build.gradle

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

Geben Sie hier die Bildbeschreibung ein

ksgngrkn
quelle
6
Ich hatte das gleiche Problem. Build > Rebuild Project hat es für mich gelöst.
Ban-Geoengineering

Antworten:

52

Suchen Sie nach der Klasse des Fragments, das die Navigationsquelle darstellt. Wenn Sie die Navigation von FragmentA nach FragmentB definieren, finden Sie die FragmentADirections-Klasse mit den darin definierten Aktionen (in nav_graph.xml).

Um dann eine Richtungsklasse (auch Argumentklasse) zu generieren, müssen Sie gehen und Project level gradledann auf den buildBefehl klicken . Hier habe ich einen Screenshot angehängt, um ein klares Verständnis zu vermitteln.

Geben Sie hier die Bildbeschreibung ein

shmulik.r
quelle
6
Außerdem muss ich mein Projekt erneut synchronisieren, damit es angezeigt wird.
Joshua King
1
Obwohl ich alle hier vorgeschlagenen Lösungen durchgeführt habe, bevor ich zu SO gekommen bin, hat nichts funktioniert. Ich habe sogar den Cache / Neustart ungültig gemacht und immer noch nicht funktioniert. Diese Antwort ist die einzige, die ich nicht kannte oder angewendet habe, aber sie hat immer noch nicht direkt funktioniert. Es gab mir tatsächlich einen Build-Fehler, aber ich denke, es hat etwas Neues ausgelöst. Ich habe dann wieder einen sauberen Umbau gemacht und es hat endlich funktioniert.
Ace
Ungültiger Cache und Neustart funktionieren nicht von alleine, müssen bereinigt und neu erstellt werden.
Apsommer
31

Ich habe vergessen, das Plugin in der app.gradleDatei anzuwenden. Fügen Sie einfach diese Zeile hinzu

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

oder diese Zeile, wenn Sie Java verwenden

apply plugin: "androidx.navigation.safeargs"
Sanjeev
quelle
Vergessen Sie auch nicht, die Datei auf classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0"Projektebene hinzuzufügenbuild.gradle
Eric vor
12

Ich hatte ein ähnliches Problem bei der Arbeit mit Android Studio 4.2 Preview.

Das Problem war, dass die IDE irgendwie nicht die Quellordner auswählte, in denen die generierten Richtungsklassen vom Plugin platziert wurden. Das Hinzufügen des Folgenden zu meiner App build.gradle-Datei hat das Problem für mich behoben.

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

Hoffe das hilft!

Christian
quelle
Ja, das war die richtige Antwort für mich. Bereits enthalten die Plugins.
Geert Berkers
Ja, das hat endlich funktioniert, das ist die richtige Antwort für mich.
Ziv Kesten
9

Wenn Sie bereits die hinzugefügt dependencies > classpathund apply pluginaber Änderungen werden nicht angewendet, achten Sie darauf, CleanundBuilt das Projekt , um Änderungen werden übernommen.

In Android Studio:

  • Build tab > Clean project
  • Build tab > ReBuild project
Alexandre B.
quelle
8

Wir können dieses Problem beheben, indem wir die folgenden Codes in gradle hinzufügen und die App neu erstellen. Fügen Sie im Projektgradle den folgenden Code hinzu.

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

Fügen Sie im App-Gradle den folgenden Code hinzu

apply plugin: "androidx.navigation.safeargs"
Fabi
quelle
Sie sollten besser verwenden, classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"da Sie AndroidX verwenden.
Micer
7

Wenn alle oben genannten Antworten bei Ihnen nicht funktioniert haben und Sie immer noch ein Problem mit der nicht generierten Richtungsklasse haben. Stellen Sie sicher, dass Sie nach der richtigen Richtungsklasse suchen .

Zum Beispiel müssen wir Argumente von FragmentAbis übergeben FragmentB.
In der Navigationsdiagrammdatei müssen wir das <argument/>Tag unter dem Tag hinzufügen FragmentB. Auf diese Weise erhalten wir zwei generierte Klassen FragmentBArgsund FragmentADirections. Wie Sie sehen können, wurde der FragmentAName des Benutzers für die erstellte Richtungsklasse verwendet, nichtFragmentB .

Denken Sie also daran, dass die generierte Anweisungsklasse im Gegensatz zu dem, wonach der Benutzer dieser Frage sucht, den Klassennamen des Aktionsstarterfragments erhält, an das das Wort "Anweisungen" angehängt ist. Nicht der Klassenname des Zielfragments (Eigentümer des Arguments).

In der Dokumentation heißt es:

Für jedes Ziel, von dem eine Aktion ausgeht, wird eine Klasse erstellt. Der Name dieser Klasse ist der Name des Ursprungsziels, an das das Wort "Richtungen" angehängt ist.

Für das empfangende Ziel wird eine Klasse erstellt. Der Name dieser Klasse ist der Name des Ziels, an das das Wort "Args" angehängt ist.

Wenn Sie das Argument-Tag unter dem Aktions-Tag hinzufügen, wird keine Anweisungsklasse generiert. Es wird verwendet, um einen anderen Standardwert für das Argument des Zielfragments anzugeben.

Hoffe das hilft!

Rami Jemli
quelle
5

Die folgenden zwei Schritte funktionieren für mich:

  1. Projekt reinigen.
  2. Projekt neu erstellen

Android Studio 4.0 Kotlin 1.3.72

Yogesh Nikam Patil
quelle
3

Mir wurde klar, dass ich die gleichen Argumente auch in das Empfängerfragment in navi_graph.xml einfügen musste, damit die Arg-Klasse generiert werden konnte (bereits Anweisungen). Zum Beispiel:

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

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

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

</fragment>
Leck15
quelle
3

Wie Christian schrieb, half das Hinzufügen eines Quellensets für eine App-Gradle-Datei. Das Problem tritt in Android Studio 4.1 und 4.2 bei mir auf. In Kotlin DSL:

android {
    ....
    sourceSets {
        getByName("main").java.srcDirs("build/generated/source/navigation-args")
    }
}
Zdenek Sima
quelle
2

Fügen Sie in Ihrer App- / Modulebene die folgende Abhängigkeit hinzu:

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

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

Alle Antworten sind auch richtig. Ich hatte nur das Gefühl, dass ich diese Informationen hinzufügen sollte. Es hat bei mir funktioniert

Tonui Nicholus
quelle
2

Ich befolgte alle Anweisungen genau und bemerkte, dass die Directions-Klassen generiert wurden, aber beim Aufrufen im Code nicht kompiliert wurden. Dies geschah während der Verwendung von Android Studio 4.1 und 4.2 Preview.

Nach ein paar Stunden entschied ich mich für ein Downgrade auf 4.0 Stable. Alle Probleme sind jetzt weg, ich kann die FragmentDirections aufrufen und es wird kompiliert.

Ich habe einen Fehler im Issue-Tracker hinzugefügt: https://issuetracker.google.com/issues/158777967

Sean Blahovici
quelle
1
Du hast mir nur ein paar Stunden gespart! Ich hatte genau das gleiche Problem, auf Stall und Boom herabgestuft, Richtungsklassen werden generiert! Danke, dass du das geteilt hast!
Micer
2

Wenn jemand Probleme mit automatisch generierten Klassen mit SafeArgs hat, überprüfen Sie Ihre AndroidStudio-Version. Ich habe (zu diesem Zeitpunkt) 4.1 Beta verwendet und wenn es auf 4.0 heruntergestuft wurde, funktioniert es perfekt. Versuchen Sie das auf jeden Fall. Prost!

Lheonair
quelle
1

Stellen Sie außerdem sicher, dass Sie eine aktuelle Version verwenden. Hatte das Problem, dass ich eine 1.X Version hatte.

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

Und die Argumente richtig in der 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>

Code:

override fun onItemClicked(category: Category) {
     val action = CategoryFragmentDirections.actionCategoryToProductFragment(products = "myString") // /!\
     view?.findNavController()?.navigate(action)
}
Javatar
quelle
1
Zu Ihrer Information: Musste auch hinzufügen: kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() }to build.gradle
Javatar
1

In meinem Fall bestand das Problem darin, dass ich dasselbe Fragment mit derselben ID in 2 Navigationsdiagrammen verwendete.

Android Studio hat die Aktionen eines der Navigationsdiagramme nicht erkannt.

Die Lösung für mich bestand also darin , die ID eines der Navigationsdiagramme zu ändern, neu zu erstellen, die ID erneut zu ändern und erneut zu erstellen .

Danach hat alles wieder funktioniert

Jorge Casariego
quelle
1

Es hat ein bisschen gedauert, um herauszufinden, aber Sie benötigen sowohl Aktionen als auch Argumente in Ihrer nav xml-Datei, um beide zu generieren.

<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>
Andrei Chernyshev
quelle
Was meinst du ? Aktion und Argument im selben Fragment-Tag? macht keinen Sinn. Das Argument sollte sich im Ziel befinden und die Aktion sollte sich in der Aktion befinden, die das Fragment-Tag erstellt
Antroid
0

In meinem Fall befand sich der fehlende Teil zunächst in der Datei 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"
}

}}

und dann musste ich das Plugin in App- und Navigationsmodulen hinzufügen (ich trenne die Navigation normalerweise in einem anderen):

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

Bereinigen -> Erstellen Aber musste den Pfad zur Aktion noch manuell hinzufügen

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment
Fernando Prieto
quelle