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

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

<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 ответ

Решение

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

Чтобы

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

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

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

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

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

Я нашел способ решения этой проблемы:

binding:firstStringParameter="@{notification.user.pic}"
binding:singleParameterString="@{`test`}"
Другие вопросы по тегам