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`}"