BindingAdapter не работает с DataBinding - PullRequest
       22

BindingAdapter не работает с DataBinding

0 голосов
/ 11 сентября 2018

У меня есть кнопка:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:binding="http://schemas.android.com/tools">

    <data>

        <variable
            name="vm"
            type="com.MyViewModel" />
    </data>
    <Button
                binding:singleParameterString="test"
                binding:firstStringParameter="@{vm.userName}"
    .../>
...

BindingAdapter выглядит следующим образом:

@BindingAdapter("binding:singleParameterString", "binding:firstStringParameter")
        fun setFormattedString(btn: Button, singleParameterString: String, firstStringParameter: String) {
            btn.text = String.format(singleParameterString, firstStringParameter)
        }

Это не работает, выдает следующую ошибку: «Не удается найтиустановщик для атрибута 'binding: firstStringParameter' с типом параметра java.lang.String для android.widget.Button. ".Однако, если я изменю binding:firstStringParameter="@{vm.userName}" на, например, binding:firstStringParameter="my lovely string", это будет работать.

Имя пользователя в ViewModel равно val userName: String = "my name", и если я попытаюсь android:text="@{vm.userName}", это работает.Так что проблема в привязке данных.У меня есть другой проект, где я использовал тот же код, и он работает ... Звучит как ошибка в структуре привязки данных / adaperbinding, но, возможно, кто-то сталкивался с этой проблемой?

PS Я также пытался binding:firstStringParameter="@{+ vm.userName}", не работает.

Глядя на автоматически сгенерированный класс Binding, я обнаружил очень странный код:

blah.setFormattedString(this.mboundView1, (java.lang.String)null, javaLangStringVmUserName);

1 Ответ

0 голосов
/ 11 сентября 2018

Хорошо, библиотека сломана.Я нашел решение.Он будет работать только в том случае, если оба параметра являются либо жестко закодированными строками, либо переданы из ViewModel.

Так, что

binding:firstStringParameter="@{vm.
binding:singleParameterString="@{vm.test}"

и это работает:

 binding:firstStringParameter="userName"
 binding:singleParameterString="test"

,но это не работает:

 binding:firstStringParameter="@{vm.userName}"
 binding:singleParameterString="test"
...