数据绑定和包含的布局:找不到 onClick 的 setter 属性
Databinding and included layouts: Cannot find setter attribute for onClick
我正在尝试为 <include>
d 布局设置 OnClickListener
,但在编译时收到数据绑定错误,指出数据绑定 "Cannot find the setter for attribute 'android:onClick' with parameter type 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 数据绑定 class,然后将 OnClickListener 分配给 XML.[=16 中的 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
包裹在里面ViewGroup
和 onClick
在 ViewGroup
.
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()-> viewModel.yourFunction()}">
<include layout="@layout/custom_layout"/>
这是一种变通方法,但效果很好。
我正在尝试为 <include>
d 布局设置 OnClickListener
,但在编译时收到数据绑定错误,指出数据绑定 "Cannot find the setter for attribute 'android:onClick' with parameter type 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 数据绑定 class,然后将 OnClickListener 分配给 XML.[=16 中的 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
包裹在里面ViewGroup
和 onClick
在 ViewGroup
.
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()-> viewModel.yourFunction()}">
<include layout="@layout/custom_layout"/>
这是一种变通方法,但效果很好。