我有一个按钮:
<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)
}
这不起作用,它给出以下错误:“在android.widget.Button上找不到参数类型为java.lang.String的属性'binding:firstStringParameter'的设置器。”。
但是,如果我将binding:firstStringParameter="@{vm.userName}"
更改为binding:firstStringParameter="my lovely string"
,则可以使用。
ViewModel中的用户名是val userName: String = "my name"
,如果我尝试使用android:text="@{vm.userName}"
则可以。
因此,问题在于数据绑定。我在另一个项目中使用了相同的代码,并且可以正常工作……听起来像数据绑定/自动绑定框架中的错误,但是也许有人遇到了这个问题?
P.S。
我还尝试了binding:firstStringParameter="@{
+ vm.userName}"
,但是没有用。
通过查看自动生成的Binding类,我发现了一个非常奇怪的代码:
blah.setFormattedString(this.mboundView1, (java.lang.String)null, javaLangStringVmUserName);
答案 0 :(得分:1)
好的,该库已损坏。我找到了解决方案。 仅当两个参数均为硬编码字符串或从ViewModel传递时,该参数才起作用。
所以
binding:firstStringParameter="@{vm.
binding:singleParameterString="@{vm.test}"
并且可行:
binding:firstStringParameter="userName"
binding:singleParameterString="test"
,但这不起作用:
binding:firstStringParameter="@{vm.userName}"
binding:singleParameterString="test"
答案 1 :(得分:0)
我找到了解决此问题的方法:
binding:firstStringParameter="@{notification.user.pic}"
binding:singleParameterString="@{`test`}"