2

我正在Android Jetpack Navigation使用native java. 事情是compiler自动生成负责导航图中定义的动作的类,带有对应的参数setters and getters,但它不是生成带有参数的构造函数,而只是一个空的static constructor

有什么方法可以使safeArgs pluginNavigation framework创建 this 构造函数arguments

我的xml:

<?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/edicion_basica_navigation"
    app:startDestination="@id/nav_A_fragment">

<fragment
    android:id="@+id/nav_A_fragment"
    android:name="com.fragments.A"
    android:label="@string/A"
    tools:layout="@layout/fragment_a">
    <argument
        android:name="@string/arg_id"
        android:defaultValue="0"
        app:argType="integer" />
    <argument
        android:name="@string/arg_rowid"
        android:defaultValue="0"
        app:argType="integer" />
</fragment>


<fragment
    android:id="@+id/nav_B_fragment"
    android:name="com.fragments.B"
    android:label="@string/b"
    tools:layout="@layout/fragment_b">
    <argument
        android:name="@string/arg_id"
        android:defaultValue="0"
        app:argType="integer" />
    <argument
        android:name="@string/arg_rowid"
        android:defaultValue="0"
        app:argType="integer" />    

</fragment>

<action
    android:id="@+id/A_to_B"
    app:destination="@id/nav_B_fragment" />

</navigation>

谢谢

4

2 回答 2

1

参数的默认值的存在似乎抑制了带有参数的构造函数的生成。

以下是我做的实验。如果你想继续,请从这里获取代码:https ://github.com/google-developer-training/android-kotlin-fundamentals-starter-apps/tree/master/GuessTheWord-Starter (为了未来读者们,截至撰写本文时,对代码的最后一次提交是 2020 年 9 月 1 日)。(您必须上一层才能克隆或下载 GuessTheWord-Starter 项目(除了一堆其他项目)。制作两个副本,GuessTheWordA 和 GuessTheWordB,用于两个实验。使用 Android Studio 4.1.2,我有进行以下更改以编译项目。在 GuessTheWordA/app/build.gradle 中,我添加了 buildToolsVersion 行:

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    ...

如果您查看 navigation/main_navigation.xml,您会看到分数片段包含一个具有默认值的参数。从游戏片段到分数片段有一个动作。

实验A

构建 > 重建项目

默认情况下,如果我们查看生成的 GameFragmentDirections 在此处输入图像描述

你会发现以下代码: 在此处输入图像描述

构造函数中没有参数!

打开navigation/main_navigation.xml,选择乐谱片段,去掉参数的默认值。

前: 在此处输入图像描述

后: 在此处输入图像描述

构建 > 重建项目

在此处输入图像描述

ActionGameToScore() 现在有一个 'score' 参数。

实验 B

根据文档(https://developer.android.com/guide/navigation/navigation-pass-data#override_a_destination_argument_in_an_action),我们可以在操作中覆盖目标参数。所以在 GuessTheWordB 中,转到 navigation/main_navigation.xml 并将 <argument> 标签添加到 'action_game_to_score' <action>: 在此处输入图像描述

构建 > 重建项目

同样,生成了带有参数的构造函数。(注意,尽管文档显示了什么,如果我在 <action> 中的 <argument> 中包含默认值,则构造函数不包含参数。)

于 2021-01-26T00:35:24.593 回答
0

你能分享你想去的目标片段的 XML 吗?您需要在目标片段本身上定义这些参数。像这样:

 <fragment android:id="@+id/myFragment" >
     <argument
         android:name="myArg"
         app:argType="integer"
         android:defaultValue="0" />
 </fragment>

另外,不要忘记build事后,以便生成类。

于 2020-01-17T10:46:53.010 回答