Как связать и вызвать `тип функции` в привязке данных Android? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть переменная типа (position: Int) -> Unit, и я хочу вызвать метод из xml следующим образом android:onClick="@{theMethod.invoke(someInt)}

Возможно ли это ?, тогда как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

То, как я это сделал, заключается в следующем.Ваш метод будет соответствовать классу 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.Затем внутри лямбды я вызываю нужный мне метод.

Я всегда стараюсь не помещать логику в XML, но я позволяю себе такие ярлыки, так как на самом деле не считаю их бизнесомлогика.

Надеюсь, это поможет.

0 голосов
/ 20 февраля 2019

Используйте лямбда-форму

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