解析失败:Landroid / databinding / DataBindingComponent

时间:2018-04-18 10:42:52

标签: android kotlin android-databinding kapt

我的项目中有一个kotlin android库模块,我正在尝试使用DataBinding库。我正在使用DataBindingComponent来进行一些图像加载。在编译时一切都很好,生成的DataBindingComponent接口已经创建,我可以实现它并将其注入。但是在运行时,应用程序崩溃了:

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBindingComponent;

从检查应用程序的apk和库模块的aar,它看起来不像DataBindingComponent。

一些代码段:

的build.gradle

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

...

android {

    ...
    dataBinding {
        enabled = true
    }
}


dependencies {
    ...
    kapt "com.android.databinding:compiler:3.1.1"
    ...
}

ImageBindingAdapter

class ImageBindingAdapter(private val loadImage: (ImageView, String) -> Unit) {

    @BindingAdapter("imageUrl")
    fun setImageUrl(view: ImageView, imageUrl: String) {
        view.loadImageWhenLaidOut(imageUrl, loadImage)
    }

}

使用DataBindingComponent

itemRecyclerAdapter.dataBindingComponent = object : DataBindingComponent {
    override fun getImageBindingAdapter(): ImageBindingAdapter {
        return ImageBindingAdapter({ imageView, url ->
            loadImage(imageView, url)
        })
    }
}

2 个答案:

答案 0 :(得分:0)

以我的经验,这个问题只是一个红色的鲱鱼。

我只是花了几天的时间来找出类似问题的根本原因。

我正在将应用程序转换为库,结果发现自android-14起,R.java中的常量不再是库的最终版本。

所以我必须确保在switch语句,注释等中未使用R.id。

很难找到根本原因,因为大多数注释处理器都被破坏,它被隐藏在数据绑定库的大量错误中。

我建议您做的第一件事是增加错误显示限制。 就我而言,该项目有2400多个错误。

这个Gradle片段挽救了这一天:

gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xmaxerrs" << "10000"
            options.compilerArgs << "-Xmaxwarns" << "10000"
}

答案 1 :(得分:0)

这很可能是由于主应用模块中缺少数据绑定声明造成的:

dataBinding { 
    enabled = true 
}

感谢sergej shafarenka和他的comment