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

M.P*_*roy 2 android kotlin android-databinding

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

这里的上下文是我正在使用数据绑定来膨胀包含的布局,以便可以从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
    }
}
Run Code Online (Sandbox Code Playgroud)

包括布局

<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>
Run Code Online (Sandbox Code Playgroud)

包含布局

<layout>

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

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

</layout>
Run Code Online (Sandbox Code Playgroud)

M.P*_*roy 5

看来您实际上无法<include>直接将OnClick处理程序分配给代码。通过在IncludedLayout数据绑定类中添加另一个变量,然后将OnClickListener分配给IncudedLayoutXML的根视图,我设法使其工作。

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

viewModel

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

包括布局

<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>
Run Code Online (Sandbox Code Playgroud)

包含布局

<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>
Run Code Online (Sandbox Code Playgroud)