0

我正在将数据绑定与我的视图模型和视图一起使用,并且我希望我的自定义视图能够观察我的自定义类型,如下所示:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="viewModel"
            type="com.myapp.MyViewModel" />
    </data>

    ...

        <com.myapp.MyCustomView
            android:id="@+id/custom_view"
            app:thing="@{viewModel.customThing}" />. <!-- customThing is type com.myapp.MyThing -->
/>

在上面的例子中,viewModel.customThing是一种MyCustomView理解和期望的类型。我可以通过这种方式将它传递给我的视图吗?如果没有,是否有另一种方法可以将自定义类型绑定到 XML 中的自定义视图?我似乎无法让它工作。

4

1 回答 1

0

是的,您可以让您的自定义视图支持数据绑定。有两种方法可以为您的自定义视图实现此功能。

1.绑定适配器

例如,在您的情况下

@BindingAdapter("thing") // attribute that you want to support data binding
fun setThing(view: MyCustomView, value: MyThing) {
    view.processThing(value)
}

但是您应该注意,在 android studio 中预览布局时,绑定适配器方式可能会出现问题。

2.绑定到setter

假设有一个名为“activity_main.xml”的布局并且该布局支持数据绑定。并且布局中有一个 TextView 小部件。

<TextView
   android:id="@+id/title
   android:text="title"
   android:enabled="@{true}"/>

如果您看到数据绑定库生成的调用的类ActivityMainBindingImpl.java,您可以看到该android:enabled="@{true}"部分已转换为this.title.setEnabled(true);

如您所见,数据绑定库称为它的设置器。因此,如果您希望事物属性支持数据绑定,您可以在自定义视图类中添加一个 setter。

fun setThing(value: MyThing){
  // Do your stuff
}

完成添加自定义设置器后,将光标放在布局编辑器中的属性“事物”中,然后按ctrl+b(转到定义快捷方式)。您可以看到它与您声明的 setter 连接。

于 2021-09-17T05:07:57.873 回答