如何在 android 数据绑定中绑定和调用“函数类型”?

How do i bind and invoke`function type` in android data binding?

我有一个 (position: Int) -> Unit 类型的变量,我想像这样从 xml 调用方法 android:onClick="@{theMethod.invoke(someInt)}

这可能吗?那我该怎么做呢?

使用 lambda 形式

android:onClick="@{() -> theMethod.invoke(someInt)}

我的做法如下。您拥有的方法将对应于 class kotlin.jvm.functions.Function1。所以我的想法是在 XML 中这样声明:

<data>
    <import type="kotlin.jvm.functions.Function1"/>
    <import type="kotlin.Unit"/>

    <variable
        name="theMethod"
        type="Function1&lt;Integer, Unit>"/>
</data>

它看起来不漂亮,但很管用。我们导入我们想要的,然后声明我们想要的类型的绑定变量。请注意字符 < 在尝试定义泛型类型时是非法的,因此我们使用 &lt;.

现在应该很容易使用了。我喜欢这样做:

android:onClick="@{_ -> theMethod.invoke(someInt)}"

onClick 的方法签名要求我们传入一个接收一个 View 类型参数的方法。我对使用它不感兴趣,所以我在传递给 onClick 的 lambda 中将其声明为 _。然后在 lambda 中调用我想要的方法。

我总是努力不将逻辑放在 XML 中,但我允许自己使用这些快捷方式,因为我并不真正将它们视为业务逻辑。

希望对您有所帮助。

documentation 提出了另一种语法更漂亮的方法:

创建具有必要功能的class:

class Presenter {
    fun compeleteChange(task: Task, isChecked: bool){}
}

导入到 xml:

 <data>
   <variable
        name="presenter"
        type="my.location.Presenter" />
</data>

像这样使用它:

<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

这样,您就可以使用自定义签名了。