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如下所示:
The BindingAdapter looks as follows:
@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"
,这将起作用.
This doesn't work, it gives the following error: "Cannot find the setter for attribute 'binding:firstStringParameter' with parameter type java.lang.String on android.widget.Button.".
However, if I change binding:firstStringParameter="@{vm.userName}"
to, for example, binding:firstStringParameter="my lovely string"
this will work.
ViewModel中的用户名是val userName: String = "my name"
,如果我尝试使用android:text="@{vm.userName}"
则可以.
因此,问题在于数据绑定.我有另一个项目,我在其中使用了相同的代码,并且可以正常工作……听起来像数据绑定/自动绑定框架中的错误,但是也许有人遇到了这个问题?
The userName in the ViewModel is val userName: String = "my name"
and if I try android:text="@{vm.userName}"
that works.
So the problem is in the databinding. I've got another project where I used the same code and it works... Sounds like a bug in the databinding/adaperbinding framework, but maybe someone came across this problem?
P.S.
我也尝试了binding:firstStringParameter="@{
+ vm.userName}"
,没有用.
P.S.
I also tried binding:firstStringParameter="@{
+ vm.userName}"
, did not work.
通过查看自动生成的Binding类,我发现了一个非常奇怪的代码:
By looking at the autogenerated Binding class I discovered a very strange code:
blah.setFormattedString(this.mboundView1, (java.lang.String)null, javaLangStringVmUserName);
推荐答案
好的,库已损坏.我找到了解决方案. 仅当两个参数均为硬编码字符串或从ViewModel传递时,该参数才起作用.
Ok, the library is broken. I found a solution. It will only work if both parameters are either hardcoded strings OR are passed from the ViewModel.
所以
binding:firstStringParameter="@{vm.
binding:singleParameterString="@{vm.test}"
并且可行:
binding:firstStringParameter="userName"
binding:singleParameterString="test"
,但这不起作用:
binding:firstStringParameter="@{vm.userName}"
binding:singleParameterString="test"
这篇关于BindingAdapter不适用于DataBinding的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!