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
kotlin
android-navigation
android-jetpack
ksgngrkn
quelle
quelle
Antworten:
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 gradle
dann auf denbuild
Befehl klicken . Hier habe ich einen Screenshot angehängt, um ein klares Verständnis zu vermitteln.quelle
Ich habe vergessen, das Plugin in der
app.gradle
Datei anzuwenden. Fügen Sie einfach diese Zeile hinzuapply plugin: "androidx.navigation.safeargs.kotlin"
oder diese Zeile, wenn Sie Java verwenden
apply plugin: "androidx.navigation.safeargs"
quelle
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0"
Projektebene hinzuzufügenbuild.gradle
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!
quelle
Wenn Sie bereits die hinzugefügt
dependencies > classpath
undapply plugin
aber Änderungen werden nicht angewendet, achten Sie darauf,Clean
undBuilt
das Projekt , um Änderungen werden übernommen.In Android Studio:
Build tab > Clean project
Build tab > ReBuild project
quelle
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"
quelle
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
da Sie AndroidX verwenden.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
FragmentA
bis übergebenFragmentB
.In der Navigationsdiagrammdatei müssen wir das
<argument/>
Tag unter dem Tag hinzufügenFragmentB
. Auf diese Weise erhalten wir zwei generierte KlassenFragmentBArgs
undFragmentADirections
. Wie Sie sehen können, wurde derFragmentA
Name 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:
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!
quelle
Die folgenden zwei Schritte funktionieren für mich:
Android Studio 4.0 Kotlin 1.3.72
quelle
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>
quelle
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") } }
quelle
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
quelle
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
quelle
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!
quelle
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) }
quelle
kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() }
to build.gradleIn 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
quelle
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>
quelle
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
quelle