使用Android数据绑定时禁用Kotlin合成绑定

时间:2019-05-12 21:40:24

标签: android kotlin android-databinding android-jetpack android-ktx

我正在研究this Udacity course on Android/Kotlin/KTX。 “关于我”应用程序引入了数据绑定,而Android团队似乎advise against using KTX binding。所以我想用前者代替后者。

但是,事情并没有按预期进行。这些是我面临的怪异问题:

  1. 在第一次通过时,我无法让Android Studio识别我的任何R.id.viewName ID。键入R.id.会给我各种各样的选择,例如R.id.action_bar,但我的活动却没有。在某种程度上,这种情况已经清除。
  2. 在我构建事物之前,编辑者抱怨数据绑定类的引用尚未解析(例如lateinit var binding: ActivityMainBinding)。实际上,我认为这花费了不止一个构建,可能是由于我在其他地方乱丢(见下文)而修复的。
  3. 每个视图ID仍作为包含该ID的视图对象的全局变量生成。也就是说,如果我有一个ID为doneButton的按钮,只需将其导入即可在代码中将其作为综合doneButton进行引用。我认为这意味着对象总是在运行时生成,即使我不打算使用它们。如何使这些KTX样式的绑定消失?

这是我的构建包:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是我的模块gradle:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.android.aboutme"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

在网上搜索获取生成数据绑定类的方法时,我在gradle.properties中发现了a possible need to include the following line

android.databinding.enableV2=true

这样做后,我进行了重新构建,瞧,这些类终于建立了。因此,当我决定最好确保自己了解真正解决问题的方式时,我准备将有关丢失位的反馈发送给Udacity。因此,在成功运行程序之后,我删除了上面的gradle.properties行,清理并重建了项目。令我惊讶的是,它仍然可以运行。

所以我不知道是什么解决了该问题,或者如何在下一个项目中解决这些问题。

我还想防止实例化所有全局KTX绑定类,但我仍然不知道如何做到这一点。

Another SO answer声称针对生成绑定类的问题提供了两种解决方案,但是给出的解决方案适用于2016年和2017年,尽管没有实现这些解决方案,上述gradle文件目前仍在工作(生成绑定类) ,因此显然有一种新的方式。

感谢您提供的任何帮助! (哦,我还应该提到我使用的是完全更新的Android Studio版本3.4。)

更新1 :我正在取得一些进展。似乎只有Android Studio 3.4代码编辑器无法识别生成的数据绑定类。重建时会再次识别这些类,但是在清除时会丢失识别。我不确定这种理解是否能解决我的所有问题...

更新2 :这是(至少部分是)an Android Studio bug,该问题已于3月修复,适用于Canary 7。

1 个答案:

答案 0 :(得分:0)

为了禁用 Kotlin Synthetic 访问,从应用级 build.gradle 文件中删除插件 kotlin-android-extensions。此插件生成合成导入。