6

我在我的 android 项目中使用导航组件。我启用了 Gradle 的类型安全 args 插件,这是我的build.gradle(app)文件。

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"

}

和我的build.gradle(project)文件。

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
 }

我的导航图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>

即使在多次尝试构建项目之后,目标片段的args类也没有创建。
这是我的动作发起片段的代码(SignUpFragment)

SignUpFragmentDirections.ActionSignUpFragmentToSignInFragment action =
                            SignUpFragmentDirections.actionSignUpFragmentToSignInFragment();
                    action.setEmail(email);
                    action.setPassword(password);

这是我要访问这些args的片段(SignInFragment)的目标代码。电子邮件密码

SignInFragmentArgs.getArguments().getString()
                                    //Set up the navigation for the appropriate action
                                    Navigation.findNavController(v).navigate(action);

根据官方文档,应该在构建项目期间生成SignInFragmentArgs代码,但它不是,我遇到了严重的麻烦,因为我想从SignUpFragment访问那些传递的参数电子邮件密码,但我找不到SignInFragmentArgs类,这意味着它是在构建过程中不会生成。 请在这里的任何人我需要解决方案。

4

1 回答 1

7

您的<argument>元素需要在<fragment>类上,而不是在元素上 - 动作的参数只为它们指向的目标上已经<action>存在的参数提供覆盖值。

<?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>
于 2020-03-17T04:21:47.650 回答