4

请原谅我糟糕的英语。

我正在使用 AndroidStudio3.1.1,我尝试使用数据绑定我的项目kotlin,但是当我尝试运行项目时出现错误。我收到的错误消息如下:

e: [kapt] 发生异常:android.databinding.tool.util.LoggedErrorException: 发现数据绑定错误。****/数据绑定错误****味精:语法错误:输入'??'没有可行的替代方案 文件:/Users/eraise/Code/Demo/app/src/main/res/layout/layout_main.xml loc:20:28 - 20:64 ****\数据绑定错误****

我可以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'}
    }
}

我在应用程序目录中的 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,我可以正确运行

4

3 回答 3

2

我认为问题出在牙套上。尝试这样做:

@{"test" + (user.name??"unknow", default=versionnumber)}'
于 2018-06-11T20:08:00.683 回答
1

我认为您设置了错误的表达式

android:text='@{"测试" + version??"unknow", default=版本号}'

我的意思是,你想用这个来达到什么目的?如果版本为空则返回“未知”,如果不是,则返回版本号?我想也是因为你没有""在你的版本号中使用(双引号)</p>

如果你想这样表达,试试这个:

android:text='@{"测试" + (version != null ? "版本号" : "unknown")}'

预期结果

if version != null-> 测试版本号</p>

如果version == null-> 测试未知

我试过了,它有效!但是,如果预期的结果不是您想要的,请告诉我,我们可以解决它。

于 2018-06-11T23:18:57.217 回答
0

由 kapt 引起的这个问题不适用于汉字。所以用英文替换它们或设置你的计算机环境如下:</p>

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
于 2020-02-09T10:55:43.607 回答