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

问题描述 投票:2回答:2

我正在尝试为OnClickListenerd布局设置<include>,但在编译时收到数据绑定错误,声明数据绑定“无法找到属性'android:onClick'的setter,参数类型为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
    }
}

Including layout

<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>

Included layout

<layout>

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

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

</layout>
android kotlin android-databinding
2个回答
4
投票

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

更改后,我的文件看起来像这样:

viewModel

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

Including layout

<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>

Included 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>

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.