【问题标题】:Databinding and included layouts: Cannot find setter attribute for onClick数据绑定和包含的布局:找不到 onClick 的 setter 属性
【发布时间】:2019-03-24 17:27:36
【问题描述】:

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

这里的上下文是我正在使用数据绑定来扩展包含的布局,以便我可以将值从我绑定到包含布局的 viewModel 传递到其中。

我尝试了数据绑定表达式的各种语法:

  • @{viewModel::onClickFunction}
  • @{viewModel.onClickFunction}
  • @{() -> viewModel.onClickFunction()}
  • @{(view) -> viewModel.onClickFunction()}
  • @{_ -> viewModel.onClickFunction()}

我已经用onClickFunction 作为函数和OnClickListener 对象尝试了以上所有方法。

有关 Stack Overflow 的其他相关问题似乎通过清理项目以重新生成数据绑定文件来解决此问题,但这对我不起作用。

相关代码sn-ps如下:

视图模型

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>

【问题讨论】:

    标签: android kotlin android-databinding


    【解决方案1】:

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

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

    视图模型

    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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多