英文:
Why does args classes not generating for navigation graph fragments?
问题
我在我的Android项目中使用了<b> navigation-components </b>。我已经启用了Gradle的类型安全参数插件,以下是我的<b> build.gradle(app) </b>文件。
apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.nibotransporti"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding.enabled = true
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
};
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata:2.2.0"
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.firebase:firebase-auth:19.3.0'
implementation 'com.google.firebase:firebase-analytics:17.2.3'
implementation 'com.google.firebase:firebase-database:19.2.1'
implementation 'com.google.firebase:firebase-firestore:21.4.1'
implementation 'com.google.android.material:material:1.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
implementation 'com.robertlevonyan.view:CustomFloatingActionButton:3.0.0'
implementation 'com.shuhart.stepview:stepview:1.5.1'
implementation 'com.alespero:expandable-cardview:0.8'
implementation 'com.anton46:stepsview:0.0.2'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.kofigyan.stateprogressbar:stateprogressbar:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.2.1'
implementation 'androidx.navigation:navigation-ui:2.2.1'
implementation "androidx.fragment:fragment:1.3.0-alpha01"
}
这是我的<b> build.gradle(project) </b>文件。
buildscript {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.google.gms:google-services:4.3.3'
def nav_version = "2.3.0-alpha03"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// 注意:不要将应用程序的依赖项放在这里;它们属于各个模块的build.gradle文件中
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这是我的<b> navigation graph </b>的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/nav_graph"
app:startDestination="@id/signInFragment">
<fragment
android:id="@+id/signInFragment"
android:name="com.example.nibotransporti.Fragment.SignInFragment"
android:label="fragment_sign_in"
tools:layout="@layout/fragment_sign_in" >
<action
android:id="@+id/action_registration"
app:destination="@id/signUpFragment" >
<argument
android:name="email"
android:defaultValue="3"
app:argType="string" />
</action>
<action
android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
app:destination="@id/workerAnalyticsFragment" />
</fragment>
<fragment
android:id="@+id/signUpFragment"
android:name="com.example.nibotransporti.Fragment.SignUpFragment"
android:label="fragment_sign_up"
tools:layout="@layout/fragment_sign_up" >
<action
android:id="@+id/action_signUpFragment_to_signInFragment"
app:destination="@id/signInFragment" >
<argument
android:name="email"
android:defaultValue="ten"
app:argType="string" />
<argument
android:name="password"
android:defaultValue="wen"
app:argType="string" />
</action>
</fragment>
<fragment
android:id="@+id/workerAnalyticsFragment"
android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
android:label="WorkerAnalyticsFragment"
tools:layout="@layout/fragment_woker_analytics"/>
<fragment
android:id="@+id/reportFragment"
android:name="com.example.nibotransporti.Fragment.ReportFragment"
android:label="fragment_stock"
tools:layout="@layout/fragment_stock" />
</navigation>
尽管我尝试了多次构建项目,目标片段的args类仍未创建。这里是发出操作的片段代码**(SignUpFragment)**。
SignUpFragmentDirections.ActionSignUpFragmentToSignInFragment action =
SignUpFragmentDirections.actionSignUpFragmentToSignInFragment();
action.setEmail(email);
action.setPassword(password);
这是目标片段的代码**(SignInFragment),我想从中访问那些args**。email和password。
SignInFragmentArgs.getArguments().getString()
<details>
<summary>英文:</summary>
I am using <b> navigation-components </b> in my android project.I have enabled Gradle's type safe args plugin here is my <b> build.gradle(app) </b> file.
apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.nibotransporti"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding.enabled = true
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
};
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata:2.2.0"
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.firebase:firebase-auth:19.3.0'
implementation 'com.google.firebase:firebase-analytics:17.2.3'
implementation 'com.google.firebase:firebase-database:19.2.1'
implementation 'com.google.firebase:firebase-firestore:21.4.1'
implementation 'com.google.android.material:material:1.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
implementation 'com.robertlevonyan.view:CustomFloatingActionButton:3.0.0'
implementation 'com.shuhart.stepview:stepview:1.5.1'
implementation 'com.alespero:expandable-cardview:0.8'
implementation 'com.anton46:stepsview:0.0.2'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.kofigyan.stateprogressbar:stateprogressbar:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.2.1'
implementation 'androidx.navigation:navigation-ui:2.2.1'
implementation "androidx.fragment:fragment:1.3.0-alpha01"
}
and my <b> build.gradle(project) </b> file.
buildscript {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.google.gms:google-services:4.3.3'
def nav_version = "2.3.0-alpha03"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
My <b> navigation graph </b> xml code is here as.
<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?> <br/>
<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"
app:startDestination="@id/signInFragment">
<fragment
android:id="@+id/signInFragment"
android:name="com.example.nibotransporti.Fragment.SignInFragment"
android:label="fragment_sign_in"
tools:layout="@layout/fragment_sign_in" >
<action
android:id="@+id/action_registration"
app:destination="@id/signUpFragment">
<argument
android:name="email"
android:defaultValue="3"
app:argType="string" />
</action>
<action
android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
app:destination="@id/workerAnalyticsFragment" />
</fragment>
<fragment
android:id="@+id/signUpFragment"
android:name="com.example.nibotransporti.Fragment.SignUpFragment"
android:label="fragment_sign_up"
tools:layout="@layout/fragment_sign_up">
<action
android:id="@+id/action_signUpFragment_to_signInFragment"
app:destination="@id/signInFragment">
<argument
android:name="email"
android:defaultValue="ten"
app:argType="string" />
<argument
android:name="password"
android:defaultValue="wen"
app:argType="string" />
</action>
</fragment>
<fragment
android:id="@+id/workerAnalyticsFragment"
android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
android:label="WorkerAnalyticsFragment"
tools:layout="@layout/fragment_woker_analytics"/>
<fragment
android:id="@+id/reportFragment"
android:name="com.example.nibotransporti.Fragment.ReportFragment"
android:label="fragment_stock"
tools:layout="@layout/fragment_stock" />
</navigation>
Even after several attempts of building the project,the **args** class for the destination fragment are not creating.<br/>
Here is my code of the fragment in which the action is originating **(SignUpFragment)** <br/>
SignUpFragmentDirections.ActionSignUpFragmentToSignInFragment action =
SignUpFragmentDirections.actionSignUpFragmentToSignInFragment();
action.setEmail(email);
action.setPassword(password);
And here is the destination code of the fragment **(SignInFragment)** where i want to access those **args** . **email** & **password**.<b/>
SignInFragmentArgs.getArguments().getString()
//Set up the navigation for the appropriate action
Navigation.findNavController(v).navigate(action);
According to the official documentation the **SignInFragmentArgs** code should be generated during building the project but it is not and i am in a serious trouble because i want to access those passed arguments **email** and **password** from **SignUpFragment** but i cannot find **SignInFragmentArgs** class which means that it is not generated during building.<br/>
Anyone here please i need the solution.
</details>
# 答案1
**得分**: 9
你的`<argument>`元素需要放在`<fragment>`类上,而不是放在`<action>`元素上 - 动作上的参数仅为它们指向的目标上已经存在的参数提供覆盖值。
```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/nav_graph"
app:startDestination="@id/signInFragment">
<fragment
android:id="@+id/signInFragment"
android:name="com.example.nibotransporti.Fragment.SignInFragment"
android:label="fragment_sign_in"
tools:layout="@layout/fragment_sign_in" >
<argument
android:name="email"
android:defaultValue="ten"
app:argType="string" />
<argument
android:name="password"
android:defaultValue="wen"
app:argType="string" />
<action
android:id="@+id/action_registration"
app:destination="@id/signUpFragment" />
<action
android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
app:destination="@id/workerAnalyticsFragment" />
</fragment>
<fragment
android:id="@+id/signUpFragment"
android:name="com.example.nibotransporti.Fragment.SignUpFragment"
android:label="fragment_sign_up"
tools:layout="@layout/fragment_sign_up">
<argument
android:name="email"
android:defaultValue="3"
app:argType="string" />
<action
android:id="@+id/action_signUpFragment_to_signInFragment"
app:destination="@id/signInFragment" />
</fragment>
<fragment
android:id="@+id/workerAnalyticsFragment"
android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
android:label="WorkerAnalyticsFragment"
tools:layout="@layout/fragment_woker_analytics"/>
<fragment
android:id="@+id/reportFragment"
android:name="com.example.nibotransporti.Fragment.ReportFragment"
android:label="fragment_stock"
tools:layout="@layout/fragment_stock" />
</navigation>
英文:
Your <argument>
elements need to be on the <fragment>
classes, not on the <action>
elements - arguments on actions only provide override values for the arguments already on the destination they point to.
<?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/nav_graph"
app:startDestination="@id/signInFragment">
<fragment
android:id="@+id/signInFragment"
android:name="com.example.nibotransporti.Fragment.SignInFragment"
android:label="fragment_sign_in"
tools:layout="@layout/fragment_sign_in" >
<argument
android:name="email"
android:defaultValue="ten"
app:argType="string" />
<argument
android:name="password"
android:defaultValue="wen"
app:argType="string" />
<action
android:id="@+id/action_registration"
app:destination="@id/signUpFragment" />
<action
android:id="@+id/action_signInFragment_to_workerAnalyticsFragment"
app:destination="@id/workerAnalyticsFragment" />
</fragment>
<fragment
android:id="@+id/signUpFragment"
android:name="com.example.nibotransporti.Fragment.SignUpFragment"
android:label="fragment_sign_up"
tools:layout="@layout/fragment_sign_up">
<argument
android:name="email"
android:defaultValue="3"
app:argType="string" />
<action
android:id="@+id/action_signUpFragment_to_signInFragment"
app:destination="@id/signInFragment" />
</fragment>
<fragment
android:id="@+id/workerAnalyticsFragment"
android:name="com.example.nibotransporti.Fragment.WorkerAnalyticsFragment"
android:label="WorkerAnalyticsFragment"
tools:layout="@layout/fragment_woker_analytics"/>
<fragment
android:id="@+id/reportFragment"
android:name="com.example.nibotransporti.Fragment.ReportFragment"
android:label="fragment_stock"
tools:layout="@layout/fragment_stock" />
</navigation>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论