【问题标题】:Listener Binding; Cannot Find the Setter监听器绑定;找不到二传手
【发布时间】:2017-06-16 17:00:25
【问题描述】:

我正在尝试实现listener bindings,但是当我运行我的代码时出现以下错误:

Caused by: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:onClick' with parameter type lambda on android.widget.Button. file:~/GithubBrowser/app/src/main/res/layout/loading_state.xml loc:30:31 - 30:52 ****\ data binding error ****

这是有问题的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="com.example.app.data.model.Resource"/>
        <import type="com.example.app.data.model.Status"/>
        <variable name="resource" type="Resource"/>
        <variable name="callback" type="com.example.app.ui.common.RetryCallback"/>
    </data>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        android:padding="@dimen/default_margin">

        <Button android:id="@+id/retry"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/retry"
            android:onClick="@{() -> callback.retry()}"/>

    </LinearLayout>

</layout>

这是布局中引用的RetryCallback接口:

package com.example.app.ui.common

interface RetryCallback {

    fun retry()

}

编辑

顶级build.gradle

buildscript {
    ext.android_tools_version = '3.0.0-alpha3'
    ext.kotlin_version = '1.1.2-5'
    repositories {
        maven { url 'https://maven.google.com' }
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$android_tools_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

ext {
    architecture_version = '1.0.0-alpha2'
    constraint_version = '1.0.2'
    dagger_version = '2.11'
    espresso_version = '2.2.2'
    glide_version = '3.7.0'
    junit_version = '4.12'
    mockito_version = '2.7.19'
    mock_server_version = '3.6.0'
    moshi_version = '1.5.0'
    retrofit_version = '2.2.0'
    support_version = '25.4.0'
    timber_version = '4.5.1'
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
        maven { url 'https://maven.google.com' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

还有应用模块build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            testCoverageEnabled !project.hasProperty('android.injected.invoked.from.ide')
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

kapt {
    generateStubs = true
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

    compile "com.android.support:appcompat-v7:$support_version"
    compile "com.android.support:cardview-v7:$support_version"
    compile "com.android.support:design:$support_version"
    compile "com.android.support:recyclerview-v7:$support_version"
    compile "com.android.support.constraint:constraint-layout:$constraint_version"

    compile "android.arch.lifecycle:extensions:$architecture_version"
    compile "android.arch.lifecycle:runtime:$architecture_version"
    compile "android.arch.persistence.room:runtime:$architecture_version"

    compile "com.google.dagger:dagger:$dagger_version"
    compile "com.google.dagger:dagger-android:$dagger_version"
    compile "com.google.dagger:dagger-android-support:$dagger_version"

    compile "com.squareup.moshi:moshi:$moshi_version"
    compile "com.squareup.retrofit2:retrofit:$retrofit_version"
    compile "com.squareup.retrofit2:converter-moshi:$retrofit_version"

    compile "com.github.bumptech.glide:glide:$glide_version"

    compile "com.jakewharton.timber:timber:$timber_version"

    kapt "com.android.databinding:compiler:$android_tools_version"
    kapt "com.google.dagger:dagger-android-processor:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"
    kapt "android.arch.persistence.room:compiler:$architecture_version"
    kapt "android.arch.lifecycle:compiler:$architecture_version"

    testCompile "junit:junit:$junit_version"
    testCompile "com.squareup.okhttp3:mockwebserver:$mock_server_version"
    testCompile ("android.arch.core:core-testing:$architecture_version", {
        exclude group: 'com.android.support', module: 'support-compat'
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.android.support', module: 'support-ccore-utils'
    })

    androidTestCompile "com.android.support:appcompat-v7:$support_version"
    androidTestCompile "com.android.support:cardview-v7:$support_version"
    androidTestCompile "com.android.support:design:$support_version"
    androidTestCompile "com.android.support:recyclerview-v7:$support_version"

    androidTestCompile ("com.android.support.test.espresso:espresso-core:$espresso_version", {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
    })

    androidTestCompile ("com.android.support.test.espresso:espresso-contrib:$espresso_version", {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
    })

    androidTestCompile "org.mockito:mockito-android:$mockito_version"
}

【问题讨论】:

  • 很奇怪。它对我来说就像一个魅力......你还有其他问题吗?你能发布你的build.gradles 吗?
  • @Lovis 当然,已添加
  • remove kapt { generateStubs = true },kapt3 不允许这样做(并且您正在使用 kapt3,因为您 apply plugin kotlin-kapt 如果这没有帮助,这可能是 Studio 3.0 的问题,我会等到它最终
  • @Lovis 啊,我什至没想过要检查它是否是 3.0 问题。我尝试过使用和不使用kapt { generateStubs = true }。我在 2.3.3 中打开了项目(并降低了 gradle 版本),它运行良好!感谢您的帮助。
  • 接受 Matej Drobnic 的回答!

标签: android kotlin android-databinding


【解决方案1】:

我刚刚遇到了这个问题,我设法通过删除 .idea、.gradle 和 gradle 文件夹来解决它,并让 Android Studio 从 gradle 文件从头开始重新创建整个项目。

【讨论】:

  • 谢谢。有用。我现在知道的是,如果发生错误,首先删除 .gradle 文件,然后删除 .idea 文件:D
  • @AjayShrestha 删除 .gradle 为我修复了它,谢谢!
  • 删除 .gradle 和 .idea 对我有用,我在 getter 方法上遇到问题。很好,谢谢你!
  • 它工作正常。就我而言,我更改了项目包名称和应用程序名称。我认为Android工作室已经混淆了。
  • 这个!!!我为此浪费了大约 2 个小时,用放大镜浏览了 stackoverflow。一直在说“这是你的 xml 错误,确保你的变量是正确的,公共吸气剂等等等”...... - 没有错,只是一个丑陋的 android studio 错误。这应该是被接受的答案。
【解决方案2】:

确保apply plugin: 'kotlin-kapt' 在 build.gradle 中。

如果您遇到这种情况并且没有重新构建项目、删除目录、清除 AS 设置做任何事情。没有它的IDE很好,但是构建失败了。

如果 android studio 有更好的错误信息就好了。

【讨论】:

  • 这个很有帮助。清理项目和删除 .idea 和 .gradle 文件没有帮助,但应用插件有帮助。
  • 确实如此。清洁和重新导入没有帮助。看起来 android 插件对“kapt”插件有“静默”依赖。如果不满意并且您的模块中有数据绑定注释,它将给出上述错误消息。我很惊讶@androiddev 家伙到目前为止还没有添加有用的消息!
【解决方案3】:

只需重建项目。可能是因为你做了一些重构

【讨论】:

    【解决方案4】:

    有效案例: 如果 xml 文件中有错误,则会引发此错误。首先仔细阅读xml,如果发现问题,请修复它。

    无效的情况: 对我来说,问题是针对已从项目中删除的文件或文件已重命名且数据绑定引用旧文件而引发的。

    我不知道如何每次都解决这个问题,但我有很多东西有时有效,有时无效。

    修复数字 1:

    在项目根目录中运行“gradle wrapper”。

    修复编号 2:

    Android Studio 清洁项目

    接下来删除项目根目录下的这些文件夹:

    rm -rf .gradle/

    rm -rf 应用程序/构建/

    rm -rf 构建

    rm -rf 分级

    rm -rf 渐变

    Android Studio 失效并重启

    现在一切都应该恢复正常了。

    【讨论】:

    • 请问如何在项目根目录下运行gradle wrapper?我几乎每次编译应用程序时都会遇到这个问题
    • @leyreyyan 如果您使用的是 Mac,则可以运行“brew install gradle”。我还添加了一个有时对我有用的附加修复程序。
    【解决方案5】:

    Rebuilding 项目为我工作。

    • Build&gt;Rebuild 重建项目
    • 如果您进入构建日志,请修复问题。
    • 再次从 Build&gt;Rebuild 重建项目

    【讨论】:

      【解决方案6】:

      如果LiveData 类型的成员变量遇到类似的问题,请检查 XML 文件中的 lambda,以调用视图 "@{() -&gt; variableName.callMethod()}"onClick 中的函数,而对于变量 @使用 987654324@。

      【讨论】:

        【解决方案7】:

        错误Cannot find the setter for attribute 的意思是,它找不到接受您提供的数据类型变量作为该属性参数的setter 方法。

        这意味着它不会找到您定义的 BindingAdapter 方法。我遇到了这个问题,因为我在 XML 布局中为使用 BindingAdapter 定义的自定义属性提供了错误的数据类型。一旦我为自定义属性提供了正确的数据类型,它就起作用了。

        因此,请检查您是否为使用 BindingAdapters 定义的自定义属性提供了正确的数据类型。

        【讨论】:

          【解决方案8】:
          1. 删除 .gradle 文件夹。
          2. 运行项目。
          3. 清理项目。
          4. 运行项目。

          为我工作。 如果订单混合或错过,它对我不起作用。

          【讨论】:

            【解决方案9】:

            正如所有其他兄弟所建议的,是的,删除 .idea、.gradle 和 gradle 文件夹后错误解决了。

            (这只是为了好奇为什么会发生这种情况,下面是我的用例): 我认为这个问题是在我的项目中引起的,因为我最近添加了一个 rxRecycleViewDataBinding 自定义库,这可能会通过混合绑定引用而导致一些绑定错误。

            【讨论】:

              猜你喜欢
              • 2019-01-01
              • 2020-10-10
              • 1970-01-01
              • 1970-01-01
              • 2023-03-19
              • 2016-12-25
              • 2021-05-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多