0

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

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

从检查应用程序的 apk 和库模块的 aar 来看,似乎没有包含 DataBindingComponent。

一些代码片段:

构建.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"
    ...
}

图像绑定适配器

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

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

}

数据绑定组件的使用

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

2 回答 2

0

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

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

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

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

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

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

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

gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xmaxerrs" << "10000"
            options.compilerArgs << "-Xmaxwarns" << "10000"
}
于 2019-02-28T01:47:02.567 回答
0

这很可能是由于您的主应用程序模块中缺少数据绑定声明引起的:

dataBinding { 
    enabled = true 
}

归功于sergej shafarenka和他的评论

于 2021-02-26T11:55:29.373 回答