BindingAdapter 不适用于 DataBinding

BindingAdapter doesn't work with 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)
        }

这不起作用,它给出了以下错误:"Cannot find the setter for attribute 'binding:firstStringParameter' with parameter type java.lang.String on android.widget.Button."。 但是,如果我将 binding:firstStringParameter="@{vm.userName}" 更改为 binding:firstStringParameter="my lovely string",这将起作用。

ViewModel 中的用户名是 val userName: String = "my name",如果我尝试 android:text="@{vm.userName}" 就可以了。 所以问题出在数据绑定中。我有另一个项目,我使用了相同的代码并且它可以工作...听起来像是 databinding/adaperbinding 框架中的错误,但也许有人遇到过这个问题?

P.S。 我也试过binding:firstStringParameter="@{+ vm.userName}",没用

通过查看自动生成的绑定 class 我发现了一个非常奇怪的代码:

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

好的,图书馆坏了。我找到了解决办法。 它仅在两个参数都是硬编码字符串或从 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`}"