数据绑定和包含的布局:找不到 onClick 的 setter 属性

Databinding and included layouts: Cannot find setter attribute for onClick

我正在尝试为 <include>d 布局设置 OnClickListener,但在编译时收到数据绑定错误,指出数据绑定 "Cannot find the setter for attribute 'android:onClick' with parameter type android.view.View.OnClickListener".

这里的上下文是我正在使用数据绑定来扩展包含的布局,以便我可以将值从我绑定到包含布局的 viewModel 传递给它。

我已经为数据绑定表达式尝试了多种语法:

我已经用 onClickFunction 作为函数和 OnClickListener 对象尝试了以上所有方法。

Stack Overflow 上的其他相关问题似乎通过清理项目以重新生成数据绑定文件来解决此问题,但这对我不起作用。

相关代码片段如下:

视图模型

class MyViewModel() {
    val onClickFunctionAsAListener: OnClickListener = object:OnClickListener{
        override fun onClick(v: View?) {
            //Do something
        }
    }

    fun onClickFunction() {
            //Do something
    }
}

包括布局

<layout>

    <data>
        <variable name="viewModel" type="full.package.name.MyViewModel"/>
    </data>

    <LinearLayout>
        <include 
            layout="@layout/included_layout"
            android:onClick="@{viewModel.onClickListener}"
            app:customAttribute="@{`someText`}/>
    </LinearLayout>

</layout>

包含布局

<layout>

    <data>
        <variable name="customAttribute" type="String"/>
    </data>

    <TextView
        layout="@layout/included_layout"
        android:text="@{customAttribute}"/>

</layout>

您似乎无法直接将 OnClick 处理程序直接分配给 <include> 标记。我设法通过将另一个变量添加到 IncludedLayouts 数据绑定 class,然后将 OnClickListener 分配给 XML.[=16 中的 IncudedLayouts 根视图来使其工作=]

更改后,我的文件如下所示:

视图模型

class MyViewModel() {
    val onClickFunction: OnClickListener = object:OnClickListener{
        override fun onClick(v: View?) {
            //Do something
        }
    }
}

包括布局

<layout>

    <data>
        <variable name="viewModel" type="full.package.name.MyViewModel"/>
    </data>

    <LinearLayout>
        <include 
            layout="@layout/included_layout"
            app:onClick="@{viewModel.onClickListener}"
            app:customAttribute="@{`someText`}/>
    </LinearLayout>

</layout>

包含布局

<layout>

    <data>
        <variable name="customAttribute" type="String"/>
        <variable name="onClick" type="android.view.View.OnClickListener"/>
    </data>

    <TextView
        layout="@layout/included_layout"
        android:text="@{customAttribute}"
        android:onClick="@{onClick}"/>

</layout>

include标签不直接支持onClick方法。虽然选择的答案是正确的,但我不会将 onClickLister 传递给 include 布局(或自定义 @BindingAdapter,这也是另一种解决方案),我只是将 include 包裹在里面ViewGrouponClickViewGroup.

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{()-> viewModel.yourFunction()}">
    <include layout="@layout/custom_layout"/>

这是一种变通方法,但效果很好。