我正在尝试为OnClickListener
d布局设置<include>
,但在编译时收到数据绑定错误,声明数据绑定“无法找到属性'android:onClick'的setter,参数类型为android.view.View.OnClickListener”。
这里的上下文是我正在使用数据绑定来扩展包含的布局,以便我可以从我绑定到包含布局的viewModel
中将值传递给它。
我已经尝试了数据绑定表达式的各种语法:
@{viewModel::onClickFunction}
@{viewModel.onClickFunction}
@{() -> viewModel.onClickFunction()}
@{(view) -> viewModel.onClickFunction()}
@{_ -> viewModel.onClickFunction()}
我用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>
标记。我设法通过向IncludedLayout
s数据绑定类添加另一个变量,然后将OnClickListener分配给XML中的IncudedLayout
s根视图来使其工作。
更改后,我的文件看起来像这样:
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
包裹在RecyclerView
和onClick
上RecyclerView
。
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()-> viewModel.yourFunction()}">
<include layout="@layout/custom_layout"/>
这是一种解决方法,但作为魅力。