Android开发中@BindingAdapter无法识别,报错属性foo未找到
在多模块Android项目中使用@BindingAdapter时,若遇到AAPT: error: attribute foo (aka com.company.android.master:foo) not found错误,可按以下步骤排查解决:
现有代码参考
FooModule.kt
@BindingAdapter("app:foo") fun setFoo(view: ImageView, foo: String) { print(foo) }
foo_layout.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/clRoot" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/primary" android:clickable="true" android:focusable="true" android:orientation="vertical"> <LinearLayout android:id="@+id/llSearchContainer" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="@drawable/rect_surface6_round8" android:elevation="24dp" android:gravity="center" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/ivHideSearch" android:layout_width="40dp" android:layout_height="40dp" android:layout_margin="8dp" android:background="@drawable/ripple_dark_circle" android:contentDescription="@string/wat" android:padding="8dp" app:foo="@{`foo`}" app:tint="@color/icon_primary" /> ... </LinearLayout>
模块内build.gradle.kts
plugins { alias(libs.plugins.convention.android.library) alias(libs.plugins.convention.compose.dependency) id("kotlin-kapt") kotlin("kapt") id("kotlin-parcelize") } android { resourcePrefix = "dl_" namespace = "com.company.foo" buildFeatures { dataBinding = true viewBinding = true } buildFeatures.viewBinding = true viewBinding.isEnabled = true } dependencies { implementation(projects.appResources) implementation(libs.androidx.appcompat) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.ktx) implementation(libs.androidx.recyclerview) implementation(libs.androidx.transition) implementation(libs.koin.android) implementation(libs.lottie) implementation(libs.lottie.compose) implementation(libs.playservices.maps) implementation(libs.result) implementation(libs.result.coroutines) implementation(libs.rxjava) kapt(libs.compiler) }
具体解决步骤
规范BindingAdapter函数的定义:必须是顶层函数(直接写在文件根目录,不属于任何类),或放在伴生对象中并添加
@JvmStatic注解,否则DataBinding无法识别该适配器:// 推荐:顶层函数 @BindingAdapter("app:foo") fun setFoo(view: ImageView, foo: String) { print(foo) } // 备选:伴生对象方式 object FooModule { @JvmStatic @BindingAdapter("app:foo") fun setFoo(view: ImageView, foo: String) { print(foo) } }检查DataBinding注解处理器依赖:确保
kapt依赖的是DataBinding编译器,若libs.compiler指向不明确,替换为具体依赖(版本需与你的AGP版本匹配):kapt("androidx.databinding:databinding-compiler:7.4.3")同时清理
buildFeatures中的重复配置,保留一次dataBinding = true和viewBinding = true即可。清理缓存并重建项目:执行Android Studio的
File > Invalidate Caches... > Invalidate and Restart,再运行Clean Project和Rebuild Project。多模块项目的缓存问题常导致注解处理器未生成属性映射文件。核对命名空间与模块依赖:错误提示中的属性命名空间
com.company.android.master与模块定义的com.company.foo不符,需确认:- XML与BindingAdapter是否在同一模块;
- 若不在同一模块,确保XML所在模块已依赖定义BindingAdapter的模块;
- XML中已正确添加
xmlns:app="http://schemas.android.com/apk/res-auto"命名空间。
确认参数类型匹配:XML中传递的参数类型(此处为字符串
@{foo})需与BindingAdapter函数的参数类型(String)完全一致,避免类型不匹配导致的隐性错误。
内容的提问来源于stack exchange,提问作者Yarneo

