我使用导航库和safeargs来传递数据。我将参数定义为像这样的片段。
<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,我可以使用它但是当我点击&#34; make project&#34;时,OtherFragmentDirection类不生成。是那个错误还是我必须做一些不同的事情。
Thnx寻求建议。
buildscript {
...
dependencies {
...
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"
}
}
的build.gradle
apply plugin: "androidx.navigation.safeargs"
MainActivity.kt
答案 0 :(得分:33)
我忘记在app.gradle
文件中应用插件,只需添加此行
apply plugin: "androidx.navigation.safeargs.kotlin"
或此行(如果您使用的是Java
)apply plugin: "androidx.navigation.safeargs"
答案 1 :(得分:15)
在使用android studio 4.2预览版时,我遇到了类似的问题。
问题是,IDE不知何故没有选择由插件放置生成的方向类的源文件夹。因此,将以下内容添加到我的应用程序build.gradle文件中可以为我解决此问题。
sourceSets {
main {
java {
srcDirs += 'build/generated/source/navigation-args'
}
}
}
希望这会有所帮助!
答案 2 :(得分:12)
查找作为导航源的片段的类。如果您定义从FragmentA到FragmentB的导航,您会发现FragmentADirections类及其中定义的动作(在nav_graph.xml中)。
答案 3 :(得分:10)
我们可以通过在gradle中添加以下代码并重建应用程序来解决此问题。在项目gradle中,添加以下代码。
mbcstowcs()
在应用gradle中添加以下代码
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
答案 4 :(得分:9)
如果您已经添加了dependencies > classpath
和apply plugin
但未应用更改,请确保将 Clean
和Built
中的项目应用订单更改。
在Android Studio中:
Build tab > Clean project
Build tab > ReBuild project
答案 5 :(得分:8)
如果上述所有答案均对您不起作用,并且您仍然对无法生成路线类有疑问。 确保您正在寻找正确的路线指示课程。
例如,我们必须将参数从FragmentA
传递到FragmentB
。
在导航图文件中,我们必须在<argument/>
的标记下添加FragmentB
标记。这样,我们将获得两个生成的类FragmentBArgs
和FragmentADirections
。如您所见,是用于创建的路线类别的FragmentA
的名称,而不是FragmentB
。
请注意,与该问题的用户所寻找的内容不同,生成的Directions类将获得操作启动器片段的类名称,并在其后附加单词“ Directions”。不是目标片段的类名(参数的所有者)。
documentation说的是:
为操作起源的每个目的地创建一个类。 此类的名称是原始目的地的名称, 附加单词“ Directions”。
为接收目的地创建一个类。这个的名字 class是目的地的名称,后跟单词“ Args”。
此外,在action标签下添加arguments标签将不会生成路线类。用于为目标片段的参数提供不同的默认值。
希望这会有所帮助!
答案 6 :(得分:5)
正如克里斯蒂安(Christian)所写的那样,添加源代码做应用gradle文件很有帮助。这个问题发生在Android Studio 4.1和4.2中。 在Kotlin DSL中:
android {
....
sourceSets {
getByName("main").java.srcDirs("build/generated/source/navigation-args")
}
}
答案 7 :(得分:5)
以下两个步骤对我有用:
Android Studio 4.0 Kotlin 1.3.72
答案 8 :(得分:4)
对我来说,我意识到我还需要将相同的参数也放入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>
答案 9 :(得分:2)
在您的应用/模块级别添加以下依赖项:
def nav_version = "2.3.0-alpha04" //your nav_version defined
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"
所有答案也是正确的。只是觉得我应该添加此信息。对我有用
答案 10 :(得分:2)
花点时间弄清楚,但是您需要同时在nav 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>
答案 11 :(得分:2)
如果有人在使用SafeArgs自动生成类时遇到麻烦,请检查您的AndroidStudio版本。我当时使用的是4.1 beta版,当降级到4.0版时,它可以完美运行。一定要尝试。干杯!
答案 12 :(得分:2)
我遵循所有说明,并注意到正在生成Directions类,但在代码中调用时无法编译。这是在使用Android Studio 4.1和4.2预览版时发生的。
几个小时后,我决定尝试降级到4.0稳定版。现在所有问题都消失了,我可以调用FragmentDirections并进行编译。
我在问题跟踪器中添加了一个错误:https://issuetracker.google.com/issues/158777967
答案 13 :(得分:2)
还要确保使用最新版本。遇到问题了,我有一个1.X版本。
// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:2.2.1"
implementation "androidx.navigation:navigation-ui-ktx:2.2.1"
在nav.xml中正确地显示了args:
<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)
}
答案 14 :(得分:1)
在我的情况下,问题是我在两个导航图中使用了具有相同id的相同片段。
Android Studio无法识别其中一个导航图的操作。
所以对我来说,解决方案是更改其中一个导航图的ID,重新构建,再次更改ID并重新构建。
此后,一切又恢复正常
答案 15 :(得分:1)
请按照以下步骤操作:
<块引用>第一步:添加依赖
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'
}
<块引用>
第 3 步:在依赖项内的 project_level build.gradle
中添加此项
部分:
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2"
<块引用>
第 4 步:在您的 nav_graph.xml
中,确保将一个片段连接到
另一个带有 actions
。
第 5 步:清理并重建您的项目。
答案 16 :(得分:1)
我只是在清理后忘记重建我的项目:)
同样不要忘记这两个步骤:
"android.arch.navigation:navigation-safe-args-gradle-plugin:$version_navigation"
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'
答案 17 :(得分:0)
在我的情况下,缺少的部分首先在 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"
}
}
然后,我必须在 app 和 navigation 模块中添加 plugin (我通常将导航分开在另一个模块中):< / p>
apply plugin: "androidx.navigation.safeargs.kotlin"
清洁->构建,但仍必须手动添加操作路径
import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment
答案 18 :(得分:0)
问题可能出在您的apply plugin
请检查您是否正在使用Java,然后添加:
apply plugin: "androidx.navigation.safeargs"
对于kotlin,请使用以下
:apply plugin: "androidx.navigation.safeargs.kotlin"
答案 19 :(得分:0)
就我而言,我手动添加了参数......在错误的地方??♂️
在导航图中选择目的地,然后单击“参数”旁边的“+”按钮。添加相关信息,您应该可以通过 navArgs() 看到生成的 SafeArgs。
这是一个有用的图片指南。 https://medium.com/androiddevelopers/navigating-with-safeargs-bf26c17b1269
答案 20 :(得分:0)
在我的例子中,我没有控制从 Fragment A 拖动到 B,而是从 B 到 A,因此它们没有在正确的 Fragment 类中生成,菜鸟错误!所以也检查这个家伙!
答案 21 :(得分:0)
当您更新导航图上的某些操作或参数时。您需要 Build > Rebuild Project 以查看应用的更改
答案 22 :(得分:0)
出于某种原因(我仍在学习 Android 中 gradle 文件的详细信息),上述插件行不起作用。但这做到了。将此行添加到 build.gradle (app) 的 plugin
部分。
id ("androidx.navigation.safeargs")
没有冒号,没有等号。当然还有同步、重建等。这与其他答案略有不同。但细节在编程中很重要!
答案 23 :(得分:0)
app->build.gradle:
在插件内部,我添加了以下行来解决该问题:
plugins {
id "androidx.navigation.safeargs.kotlin"
}
答案 24 :(得分:0)