我正在学习这个 Android/Kotlin/KTX 的优达学城课程。在“关于我”应用程序中介绍了数据绑定,而安卓团队似乎建议不要使用 KTX 绑定。因此,我想选择前者而不是后者。
然而,事情并不像预期的那样进行。以下是我面临的奇怪问题:
我在这样做之后进行了重建,然后,类终于构建成功了。因此,我准备向Udacity发送反馈意见,但我决定最好确保我真正理解了是什么修复了问题。所以,在成功运行程序后,我删除了上述gradle.properties行,清理并重新构建了项目。令我惊讶的是,它仍然构建和运行。
因此,我不知道是什么修复了问题或如何解决下一个项目中的这些问题。
我还希望防止实例化所有全局KTX绑定类,但我仍然对如何做到这一点毫无头绪。 另一个SO答案声称提供了两种解决生成绑定类问题的方法,但给出的解决方案是针对2016年和2017年的,而上述gradle文件目前正在工作(生成绑定类),尽管没有实施那些解决方案,因此显然有一种更新的方法。
感谢您提供的任何帮助!(哦,我还应该提到,我使用的是完全更新的Android Studio版本3.4。) 更新 1: 我正在取得一些进展。似乎 Android Studio 3.4 代码编辑器是唯一无法识别生成的数据绑定类的东西。在重新构建后,这些类再次被识别,但在清理后就会失去识别。我还不确定这种理解是否解决了我所有的问题...
然而,事情并不像预期的那样进行。以下是我面临的奇怪问题:
- 第一次尝试时,我无法使Android Studio识别任何
R.id.viewName
ID。输入R.id.
会给我各种选项,例如R.id.action_bar
,但没有来自我的活动。在某个时间点,这个问题解决了。 - 编辑器抱怨未解决的数据绑定类引用,直到我构建它为止(例如
lateinit var binding: ActivityMainBinding
)。实际上,我认为需要多次构建,可能是由于我在其他地方搞砸了(见下文)。 - 每个视图ID仍然被生成为包含该ID视图对象的全局变量。也就是说,如果我有一个名为
doneButton
的按钮,我可以通过导入它来在代码中引用它作为合成doneButton
。我假设这意味着对象总是在运行时构建,即使我不打算使用它们。如何让这些KTX样式的绑定消失?
这是我的构建gradle:
// 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
中包含以下行(可能需要):
android.databinding.enableV2=true
我在这样做之后进行了重建,然后,类终于构建成功了。因此,我准备向Udacity发送反馈意见,但我决定最好确保我真正理解了是什么修复了问题。所以,在成功运行程序后,我删除了上述gradle.properties行,清理并重新构建了项目。令我惊讶的是,它仍然构建和运行。
因此,我不知道是什么修复了问题或如何解决下一个项目中的这些问题。
我还希望防止实例化所有全局KTX绑定类,但我仍然对如何做到这一点毫无头绪。 另一个SO答案声称提供了两种解决生成绑定类问题的方法,但给出的解决方案是针对2016年和2017年的,而上述gradle文件目前正在工作(生成绑定类),尽管没有实施那些解决方案,因此显然有一种更新的方法。
感谢您提供的任何帮助!(哦,我还应该提到,我使用的是完全更新的Android Studio版本3.4。) 更新 1: 我正在取得一些进展。似乎 Android Studio 3.4 代码编辑器是唯一无法识别生成的数据绑定类的东西。在重新构建后,这些类再次被识别,但在清理后就会失去识别。我还不确定这种理解是否解决了我所有的问题...
更新 2: 这是(至少部分)Android Studio 的一个 bug,已在三月份修复,即将发布 Canary 7 版本。
@Parcelize
或依赖它的内容,那么您可以删除apply plugin: 'kotlin-android-extensions'
,因为这个插件会生成合成访问器。 - CommonsWare