我正在尝试为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上的其他相关问题似乎可以通过清理项目以重新生成数据绑定文件来解决此问题,但是这对我没有用。
以下相关代码段:
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>
答案 0 :(得分:4)
似乎您实际上不能直接将OnClick处理程序直接分配给<include>
标签。通过在IncludedLayout
的数据绑定类中添加另一个变量,然后将OnClickListener分配到IncudedLayout
的XML根视图中,我设法使其工作。
更改后,我的文件如下:
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
上的onClick
和RecyclerView
。
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()-> viewModel.yourFunction()}">
<include layout="@layout/custom_layout"/>
这是一种解决方法,但可以作为魅力。