[Android] kotlin + databinding

作者: fish_leong | 来源:发表于2017-10-26 12:12 被阅读362次

    在使用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 xmlns:android="http://schemas.android.com/apk/res/android">
    
        <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的基础配置。

    异常信息处理

    1.compileSdkVersion问题

     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 android.databinding.tool.CompilerChef.sealModels(CompilerChef.java:188)
       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 org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.analyze(KotlinToJVMBytecodeCompiler.kt:365)
       at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:105)
       at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:354)
       at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules(KotlinToJVMBytecodeCompiler.kt:139)
       at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167)
       at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:55)
       at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:182)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.execCompiler(CompileServiceImpl.kt:397)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.access$execCompiler(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:365)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$2$$special$$inlined$withValidClientOrSessionProxy$lambda$1.invoke(CompileServiceImpl.kt:798)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$2$$special$$inlined$withValidClientOrSessionProxy$lambda$1.invoke(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:137)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.checkedCompile(CompileServiceImpl.kt:825)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.access$checkedCompile(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$2.invoke(CompileServiceImpl.kt:797)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$2.invoke(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.ifAlive(CompileServiceImpl.kt:1004)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.ifAlive$default(CompileServiceImpl.kt:865)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.doCompile(CompileServiceImpl.kt:791)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.access$doCompile(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1.invoke(CompileServiceImpl.kt:364)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1.invoke(CompileServiceImpl.kt:99)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.ifAlive(CompileServiceImpl.kt:1004)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.ifAlive$default(CompileServiceImpl.kt:865)
       at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:336)
       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的版本
     }  
    

    《Kotlin - Android 开发入门》

    相关文章

      网友评论

        本文标题:[Android] kotlin + databinding

        本文链接:https://www.haomeiwen.com/subject/tubhpxtx.html