Kotlin 项目中忽略了 BindingAdapter 注解。我怎样才能改变这个代码工作?

BindingAdapter annotation is ignored in kotlin project. How can I change this code to work?

我正在使用 kotlin 开发一个 android 项目,在尝试向多个按钮添加 OnTouchListener 时,我遇到了 运行 问题:无法通过XML 并且我想保持我的支持代码干净。经过一些研究,我发现我可以通过使用带有 @BindingAdapter 注释的方法来添加 XML 支持:

@BindingAdapter("onTouch")
fun Button.setXMLTouchListener(listener : View.OnTouchListener)
{
  this.setOnTouchListener(listener);
}

此方法:

class MainActivity : AppCompatActivity()
{
  ...
  ...

  fun goLeft(v : View, event : MotionEvent) : Boolean
  {
    // my code
  }
}

并在 XML 中:

<layout
  ...>
  <data>
    <variable name="main_activity" type="my.path.to.MainActivity" />
  </data>
  <androidx.constraintLayout.widget.ConstraintLayout
    ...>
    <Button
      ...
      app:onTouch="@{main_activity.goLeft}" />
    ...
  </androidx.constraintLayout.widget.ConstraintLayout>
</layout>

并在 build.gradle 中启用了数据绑定:

apply plugin: 'kotlin.kapt'

android {
  ...
  dataBinding {
    enabled = true
  }
}

这显然不起作用,这些是我尝试过的解决方案:

经过一番调试,我也发现绑定函数根本就没有运行。

可能是什么问题,我该如何解决?

首先像这样编写数据绑定适配器。

@BindingAdapter("app:onTouch")
fun setXMLTouchListener(btn : Button , listener : View.OnTouchListener)
{
    btn.setOnTouchListener(listener)
}

那就把goLeft()好玩的

val goLeftListener = View.OnTouchListener { v, event ->

        Log.d("goLeftListener " , "it Worked !")
        return@goLeftListener true
    }

并且不要忘记在 onCreate fun

的绑定对象上设置 activity
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

val binding: mainActivityBinding =
            DataBindingUtil.setContentView(this, R.layout.main_activity)

        binding.main_activity = this
}

最后一步,在 xml 布局中写入 Button 的 onTouch 属性,如下所示

<Button
.
.
app:onTouch="@{main_activity.goLeftListener}"
.
/>