具有BindingAdapter的AndroidX

时间:2018-12-21 09:28:31

标签: kotlin android-databinding androidx android-binding-adapter

我在使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,它就会失败。

我已经读过SO,有些人声称数据绑定不能在X上正常工作。但是那是10月的帖子,有些人声称它在X上适合他们。

我忘记了一些愚蠢的东西,还是真的还不能使用X?

2 个答案:

答案 0 :(得分:2)

我在使用Kotlin(1.3.30),AndroidX,DataBinding和Gradle 3.4.0的小型新项目中重现了问题

首先,Kotlin无法与annotationProcessor一起使用,必须由带有kapt插件的Kotlin注释处理工具:kotlin-kapt取代。
Kotlin documentation

然后在Gradle 3.1.0-alpha06中,自Gradle 3.2起,Google已默认启用了新版本的数据绑定编译器。
因此,您不需要使用databinding-compiler依赖项(它是集成的)。
Android Developer documentation

但即使集成在一起,也总是需要 kapt
因此,应该可以解决问题,将apply plugin: 'kotlin-kapt'添加到build.gradle app 文件的顶部,并删除androidx.databinding:databinding-compiler依赖项。 (对我有用)

答案 1 :(得分:-1)

我遇到了同样的问题。如果您的绑定适配器是用Kotlin(而不是Java)编写的,那么您将无法再将Java基本布尔变量传递给它们(或任何基本Java类型)。将您的viewModel.showGroup更改为Java.lang.Boolean或最好是Kotlin布尔值。

我还注意到,如果您在数据绑定表达式中使用布尔表达式,例如visible="@{viewModel.showGroup &amp;&amp; true}",则会输出Java原语布尔值,并且不再与Kotlin绑定适配器兼容。