Ответ 1
У меня была эта проблема, и мне удалось ее решить, удалив папки .idea,.gradle и gradle и позвольте Android Studio воссоздать весь проект с нуля из файлов gradle.
Я пытаюсь реализовать привязки прослушивателя, но когда я запускаю свой код, я получаю следующую ошибку:
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"
}
У меня была эта проблема, и мне удалось ее решить, удалив папки .idea,.gradle и gradle и позвольте Android Studio воссоздать весь проект с нуля из файлов gradle.
Убедитесь, что apply plugin: 'kotlin-kapt'
находится в build.gradle.
Если вы работаете с этим и не занимаетесь перестройкой проекта, удаление каталогов, очистка настроек AS делают все, что угодно. В IDE все в порядке, но здание терпит неудачу.
Было бы хорошо, если бы у андроид студии были лучшие сообщения об ошибках для этого.
Просто перестройте проект. Вероятно, потому, что вы сделали рефакторинг
Проект Rebuilding
работал на меня.
Build>Rebuild
Build>Rebuild
Работайте для меня. Если порядок или мисс заказа, он не работает для меня.
Действительный случай: Эта ошибка возникает, если в файле xml есть ошибка. Сначала внимательно прочтите xml, и если вы обнаружите, что проблема исправит его.
Неверный случай: Для меня проблема была поднята для файла, который был уже удален из проекта или файл был переименован, а привязка данных ссылалась на старый файл.
Я не уверен, как избавиться от проблемы каждый раз, но у меня есть несколько вещей, которые иногда работают, а иногда и нет.
Исправить номер 1:
Запуск 'gradle wrapper' в корне проекта.
Исправить номер 2:
Проект Android Studio Clean
Затем удалите эти папки в корне проекта:
rm -rf.gradle/
rm -rf app/build/
rm -rf build
rm -rf gradle
rm -rf gradlew
Android Studio Invalidate и перезапустите
Теперь все должно быть нормальным.
Как и все остальные собратья, да, ошибка устраняется после удаления папок .idea,.gradle и gradle.
(это просто для кого-то любопытного, почему это происходит, ниже приведен мой вариант использования): я думаю, что эта проблема возникла в моем проекте из-за того, что я недавно добавил одну пользовательскую библиотеку rxRecycleViewDataBinding, которая могла вызвать некоторые ошибки привязки, смешивая ссылки привязки.
Если проблема подобного типа встречается для переменной-члена типа LiveData
тогда проверьте свою лямбду в файле XML на предмет вызова в onClick
функции для представления "@{() → variableName.callMethod()}"
тогда как для переменной "@{variableName.memeberVariableName}"
.
Ошибка Cannot find the setter for attribute
означает, что он не может найти метод установки, который принимает переменную того типа данных, который вы указали в качестве параметра для этого атрибута.
Это означает, что он не найдет метод BindingAdapter, который вы определили. У меня была эта проблема, потому что я предоставлял неверный тип данных в макете XML для пользовательского атрибута, который я определил с помощью BindingAdapter. После того, как я присвоил правильный тип данных пользовательскому атрибуту, он сработал.
Итак, проверьте, предоставляете ли вы правильный тип данных для пользовательских атрибутов, которые вы можете определить с помощью BindingAdapters.