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

时间:2018-10-19 19:30:44

标签: android kotlin android-databinding

我正在尝试为OnClickListener d布局设置<include>,但是在编译时收到数据绑定错误,指出该数据绑定“无法找到属性'android:onClick'的设置方法参数类型为android.view.View.OnClickListener”。

这里的上下文是我正在使用数据绑定来使包含的布局膨胀,以便可以将已经绑定到包含布局的viewModel的值传递到其中。

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

  • @{viewModel::onClickFunction}
  • @{viewModel.onClickFunction}
  • @{() -> viewModel.onClickFunction()}
  • @{(view) -> viewModel.onClickFunction()}
  • @{_ -> viewModel.onClickFunction()}

我已经尝试使用onClickFunction作为函数以及作为OnClickListener对象的上述所有方法。

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

以下相关代码段:

viewModel

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>

2 个答案:

答案 0 :(得分:4)

似乎您实际上不能直接将OnClick处理程序直接分配给<include>标签。通过在IncludedLayout的数据绑定类中添加另一个变量,然后将OnClickListener分配到IncudedLayout的XML根视图中,我设法使其工作。

更改后,我的文件如下:

viewModel

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>

答案 1 :(得分:0)

include标记不直接支持onClick方法。虽然选择的答案是正确的,但我不会将onClickLister包裹在include@BindingAdapter的布局中(或者使用自定义的include,这也是另一种解决方案), RecyclerView上的onClickRecyclerView

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

这是一种解决方法,但可以作为魅力。