带有 BindingAdapter 的 AndroidX
AndroidX with BindingAdapter
我在让 BindingAdapter 在我的新应用程序中工作时遇到了一些问题。
我总是收到以下错误:
****/ data binding error ****msg:Cannot find the setter for attribute 'visible' with parameter type boolean
这是我的 BindingAdapter:
object BindingAdapters {
@set:BindingAdapter("visible")
@JvmStatic
var View.visible
get() = visibility == View.VISIBLE
set(value) {
visibility = if (value) View.VISIBLE else View.GONE
}
}
这是 XML 产生问题的视图:
<TextView
android:id="@+id/tvDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/item_horizontal_margin_large"
android:text="@{viewModel.item.description}"
visible="@{viewModel.showGroup}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/ctvDivision"
app:layout_constraintTop_toTopOf="parent" />
这是一个新项目,所以我从 Android X 开始,不需要进行迁移。
我在 build.grade 中有这一行:
annotationProcessor 'androidx.databinding:databinding-compiler:3.4.0-alpha09'
我正在使用 gradle 3.2.11.
我不确定是否需要这样做,但这是我膨胀绑定的代码:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
setHasOptionsMenu(true)
binding = DataBindingUtil.inflate(
layoutInflater,
R.layout.fragment_good,
container,
false
)
val view = binding?.root
binding?.viewModel = viewModel
return view
}
所有其他标准数据绑定都有效。一旦我尝试设置 BindingAdapter,它就会失败。
我读到一些人声称数据绑定不能与 X 一起正常工作。但是那些是 post 十月份的,并且有人声称它在同一个 post。
我是不是忘记了一些愚蠢的东西,或者它真的还没有与 X 一起工作?
我运行遇到了同样的问题。如果您的绑定适配器是用 Kotlin 编写的(而不是 Java),那么您不能再将 Java 原始布尔变量传递给它们(或任何原始 Java 类型)。将您的 viewModel.showGroup 更改为 Java.lang.Boolean 或最好是 Kotlin 布尔值。
我还注意到,如果您在数据绑定表达式中使用布尔表达式,例如 visible="@{viewModel.showGroup && true}"
,那么它会输出一个 Java 原始布尔值,并且不再与 Kotlin 兼容绑定适配器。
我在使用 Kotlin (1.3.30)、AndroidX、DataBinding 和 Gradle 3.4.0
的小型新项目中重现了这个问题
首先,Kotlin 不适用于 annotationProcessor
,必须由 Kotlin 注释处理工具替换:kapt
和 kotlin-kapt
插件。
Kotlin documentation
然后在 Gradle 3.1.0-alpha06 中,Google 包含了自 Gradle 3.2.
以来默认启用的新版本数据绑定编译器
所以你不需要使用 databinding-compiler
依赖(它是集成的)。
Android Developer documentation
但即使集成,也总是需要kapt。
因此,在 build.gradle
app 文件顶部添加 apply plugin: 'kotlin-kapt'
并删除 androidx.databinding:databinding-compiler
依赖项,应该可以解决问题。 (对我有用)
我在让 BindingAdapter 在我的新应用程序中工作时遇到了一些问题。
我总是收到以下错误:
****/ data binding error ****msg:Cannot find the setter for attribute 'visible' with parameter type boolean
这是我的 BindingAdapter:
object BindingAdapters {
@set:BindingAdapter("visible")
@JvmStatic
var View.visible
get() = visibility == View.VISIBLE
set(value) {
visibility = if (value) View.VISIBLE else View.GONE
}
}
这是 XML 产生问题的视图:
<TextView
android:id="@+id/tvDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/item_horizontal_margin_large"
android:text="@{viewModel.item.description}"
visible="@{viewModel.showGroup}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/ctvDivision"
app:layout_constraintTop_toTopOf="parent" />
这是一个新项目,所以我从 Android X 开始,不需要进行迁移。
我在 build.grade 中有这一行:
annotationProcessor 'androidx.databinding:databinding-compiler:3.4.0-alpha09'
我正在使用 gradle 3.2.11.
我不确定是否需要这样做,但这是我膨胀绑定的代码:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
setHasOptionsMenu(true)
binding = DataBindingUtil.inflate(
layoutInflater,
R.layout.fragment_good,
container,
false
)
val view = binding?.root
binding?.viewModel = viewModel
return view
}
所有其他标准数据绑定都有效。一旦我尝试设置 BindingAdapter,它就会失败。
我读到一些人声称数据绑定不能与 X 一起正常工作。但是那些是 post 十月份的,并且有人声称它在同一个 post。
我是不是忘记了一些愚蠢的东西,或者它真的还没有与 X 一起工作?
我运行遇到了同样的问题。如果您的绑定适配器是用 Kotlin 编写的(而不是 Java),那么您不能再将 Java 原始布尔变量传递给它们(或任何原始 Java 类型)。将您的 viewModel.showGroup 更改为 Java.lang.Boolean 或最好是 Kotlin 布尔值。
我还注意到,如果您在数据绑定表达式中使用布尔表达式,例如 visible="@{viewModel.showGroup && true}"
,那么它会输出一个 Java 原始布尔值,并且不再与 Kotlin 兼容绑定适配器。
我在使用 Kotlin (1.3.30)、AndroidX、DataBinding 和 Gradle 3.4.0
的小型新项目中重现了这个问题首先,Kotlin 不适用于 annotationProcessor
,必须由 Kotlin 注释处理工具替换:kapt
和 kotlin-kapt
插件。
Kotlin documentation
然后在 Gradle 3.1.0-alpha06 中,Google 包含了自 Gradle 3.2.
以来默认启用的新版本数据绑定编译器
所以你不需要使用 databinding-compiler
依赖(它是集成的)。
Android Developer documentation
但即使集成,也总是需要kapt。
因此,在 build.gradle
app 文件顶部添加 apply plugin: 'kotlin-kapt'
并删除 androidx.databinding:databinding-compiler
依赖项,应该可以解决问题。 (对我有用)