您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页[Android] kotlin + databinding

[Android] kotlin + databinding

来源:二三娱乐

在使用kotlin+databinding时遇到不少坑,整理了一个Demo,大致如下:
注:
如果你的kotlin项目要配置databinding,请务必注意各个插件和依赖的版本,build成功,不代表可以运行成功,需要多多尝试
这些版本是我在写这篇文章时用到的,当你看到此文时,也许各个插件版本都更新了很多,或者比我的还旧,所以在使用插件时,一定要注意其他插件与它是否兼容,不要在这些配置上浪费时间。

  • 项目 build.gradle文件
buildscript {
    //定义全局的两个变量,方便后面引用
    ext.kotlin_version = '1.1.51'//kotlin版本
    ext.gradle_version = '2.3.3'//gradle版本
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$gradle_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • 模块 build.gradle文件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'//kotlin配置
apply plugin: 'kotlin-kapt'//kapt 插件
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "leong.fish.kt.kotlindatabinding"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //开启dataBinding
    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    kapt "com.android.databinding:compiler:$gradle_version"//这里的版本对应gradle的版本
}
  • 实体类 Person.kt
package leong.fish.kt.kotlindatabinding

/**
 * Created by Leong on 2017/10/26.
 */
class Person(val name: String, val age: Int) {

}
  • 布局 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout 

    <data>
        <variable
            name="person"
            type="leong.fish.kt.kotlindatabinding.Person" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{person.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text='@{String.valueOf(person.age)}' />
    </LinearLayout>
</layout>
  • MainActivity.kt
package leong.fish.kt.kotlindatabinding

import android.app.Activity
import android.databinding.DataBindingUtil
import android.os.Bundle
import leong.fish.kt.kotlindatabinding.databinding.ActivityMainBinding

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.person = Person("fish leong", 18)
    }
}
  • 运行截图


  • 项目结构

  • 结束
    以上就是kotlin + databinding的基础配置。

异常信息处理

 Error:java.lang.RuntimeException: failure, see logs for details.
 e: java.lang.IllegalStateException: failed to analyze: java.lang.RuntimeException: failure, see logs for details.
 cannot generate view binders java.lang.RuntimeException: failure, see logs for details.
 Cannot resolve type for SafeVarargs
   at android.databinding.tool.util.L.printMessage(L.java:125)
   at android.databinding.tool.util.L.e(L.java:98)
   at android.databinding.tool.expr.Expr.getResolvedType(Expr.java:361)
   at android.databinding.tool.expr.ExprModel.lambda$resolveTypes$1(ExprModel.java:604)
   at java.util.ArrayList.forEach(ArrayList.java:1249)
   at android.databinding.tool.expr.ExprModel.resolveTypes(ExprModel.java:604)
   at android.databinding.tool.expr.ExprModel.seal(ExprModel.java:396)
   at android.databinding.tool.LayoutBinder.sealModel(LayoutBinder.java:340)
   at android.databinding.tool.DataBinder.sealModels(DataBinder.java:65)
   at 
   at android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:184)
   at android.databinding.annotationprocessor.ProcessExpressions.onHandleStep(ProcessExpressions.java:86)
   at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.runStep(ProcessDataBinding.java:189)
   at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.access$000(ProcessDataBinding.java:174)
   at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:79)
   at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
   at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
   at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
   at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
   at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
   at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
   at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1068)
   at org.jetbrains.kotlin.kapt3.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:73)
   at org.jetbrains.kotlin.kapt3.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:42)
   at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:205)
   at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:166)
   at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:82)
   at org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:89)
   at org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:99)
   at org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:76)
   at 
   at 
   at 
   at 
   at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167)
   at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:55)
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at 
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:498)
   at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324)
   at sun.rmi.transport.Transport$1.run(Transport.java:200)
   at sun.rmi.transport.Transport$1.run(Transport.java:197)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
   at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
   at java.lang.Thread.run(Thread.java:745)

上面这个异常,很蛋疼,build可以成功,但是运行时就build失败,找了好多帖子都解决不了我的问题,后来发现是compileSdkVersion版本问题,compileSdkVersion>=19

2.缺少依赖问题

 Error:(6, 40) Unresolved reference: databinding
 Error:(12, 54) Unresolved reference: ActivityMainBinding
 Error:Execution failed for task ':app:compileDebugKotlin'.
 > Compilation error. See log for more details

请检查模块build.gradle中kapt配置,如下

 apply plugin: 'kotlin-kapt'//kapt 插件
 dependencies {
     kapt "com.android.databinding:compiler:$gradle_version"//这里的版本对应gradle的版本
 }  

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务