【问题标题】:Failed resolution of: Landroid/databinding/DataBindingComponent解析失败:Landroid/databinding/DataBindingComponent
【发布时间】:2018-04-18 10:42:52
【问题描述】:

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

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

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

一些代码sn-ps:

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)
        })
    }
}

【问题讨论】:

  • 这很可能是由于主应用模块中缺少dataBinding { enabled = true } 造成的。除了添加到库模块的那个之外,您还需要在其中添加它。
  • 嗯,改错了。我现在在生成的 Binding 类(从布局文件创建)上获得了 ClassNotFound
  • @sergejshafarenka 你已经为我指明了正确的方向 - 我需要将 dataBinding 内容添加到我的依赖链中的每个 build.gradle - 所以我有 App -> Lib -> Lib并且数据绑定的东西需要全部 3
  • 是的,这是在多模块项目中正确启用数据绑定所需要做的事情。

标签: android kotlin android-databinding kapt


【解决方案1】:

根据我的经验,这个问题只是一个转移注意力的问题。

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

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

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

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

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

这个 Gradle sn-p 拯救了这一天:

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

【讨论】:

    【解决方案2】:

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

    dataBinding { 
        enabled = true 
    }
    

    感谢sergej shafarenka 和他的comment

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多