请原谅我可怜的英语。
我使用的是AndroidStudio3.1.1,我尝试使用kotlin
将数据绑定到我的项目,但是当我尝试运行该项目时出现错误。我收到的错误消息如下所示:
e:[kapt]发生异常: android.databinding.tool.util.LoggedErrorException:找到数据绑定 错误。 **** /数据绑定错误**** msg:语法错误:在输入时没有可行的选择' ??' 文件:/Users/eraise/Code/Demo/app/src/main/res/layout/layout_main.xml loc:20:28 - 20:64 **** \ data binding error ****
我可以在终端到期命令上编译apk
:./gradlew assembleDebug,
工作正常。
我的顶级build.gradle具有以下配置:
buildscript {
ext.kotlin_version = '1.2.31'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://www.jitpack.io'}
}
}
我在app dir中的build.gradle(只有相关部分):
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android{
compileSdkVersion 27
buildToolsVersion 27.1.0
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
kapt "com.android.databinding:compiler:3.1.1"
}
我的layout_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="version"
type="String"/>
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_version_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text='@{"测试" + version??"unknow", default=版本号}'
/>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEE"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
/>
</LinearLayout>
</layout>
该行出错:android:text='@{"测试" + version??"unknow", default=版本号}'
LayoutMainBinding片段:
@Override
protected void executeBindings() {
long dirtyFlags = 0;
synchronized(this) {
dirtyFlags = mDirtyFlags;
mDirtyFlags = 0;
}
java.lang.String version = mVersion;
java.lang.String javaLangStringVersion = null;
java.lang.String javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion = null;
boolean javaLangStringVersionJavaLangObjectNull = false;
if ((dirtyFlags & 0x3L) != 0) {
// Here's ?????? is 测试 if correct result.
// read ("??????") + (version)
javaLangStringVersion = ("??????") + (version);
// read ("??????") + (version) == null
javaLangStringVersionJavaLangObjectNull = (javaLangStringVersion) == (null);
if((dirtyFlags & 0x3L) != 0) {
if(javaLangStringVersionJavaLangObjectNull) {
dirtyFlags |= 0x8L;
}
else {
dirtyFlags |= 0x4L;
}
}
}
// batch finished
if ((dirtyFlags & 0x3L) != 0) {
// read ("??????") + (version) == null ? "unknow" : ("??????") + (version)
javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion = ((javaLangStringVersionJavaLangObjectNull) ? ("unknow") : (javaLangStringVersion));
}
// batch finished
if ((dirtyFlags & 0x3L) != 0) {
// api target 1
android.databinding.adapters.TextViewBindingAdapter.setText(this.tvVersionName, javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion);
}
}
如果不使用kotlin,我可以正确运行
答案 0 :(得分:2)
我认为问题出在括号上。尝试这样做:
@{"test" + (user.name??"unknow", default=versionnumber)}'
答案 1 :(得分:1)
我认为你为
设置了错误的表达方式 android:text='@{"测试" + version??"unknow", default=版本号}'
我的意思是,你想用这个来实现什么?如果版本为null然后返回“unknown”,如果不是,返回版本号?我想也是因为你没有在你的版本号
中使用""
(双引号)
如果你想以这种方式表达,试试这个:
android:text='@{"测试" + (version != null ? "版本号" : "unknown")}'
预期结果
如果version != null
- &gt;测试版本号
如果version == null
- &gt;测试未知
我尝试过它的确有效!但如果预期的结果不是你想要的,请告诉我,我们可以解决它。
答案 2 :(得分:0)
由kapt引起的此问题不适用于汉字。 因此,请用英语替换它们或将您的计算机环境设置如下:
JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8