假设我有这种使用方法的视图模型:
public int getValueA() {
return a;
}
public int getValueB() {
return b;
}
@BindingAdapter("valueA")
public void setupSomething(View view, int valueA) {
// do something with a
}
@BindingAdapter({"valueA", "valueB"})
public void setupSomethingElse(View view, int valueA, int valueB) {
// do something with a and b
}
我将其绑定到视图:
<View
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:valueA="@{viewmodel.valueA}"
bind:valueB="@{viewmodel.valueB}"/>
如何调用BindingAdapter
两种方法?现在数据绑定只是调用后者。我想我可以从setSomething
内拨打setSomethingElse
,但这对我来说有点可疑(并且部分地破坏了数据绑定的目的)。
答案 0 :(得分:2)
它就像你在暗示自己:你需要从setupSomething()
致电setupSomethingElse
。它做得很好,数据绑定如何工作。 只有最合适的@BindingAdapter
才能用于您的属性。
或者,您可以使用@BindingAdapter
的{{3}}字段。但是,只有在可以处理值的Java默认值(在您的情况下为0)时,这才是可行的。
是否必须为每个属性分配一个绑定表达式,或者某些属性是否可以不存在。如果为false,则在至少一个关联属性具有绑定表达式时将调用
BindingAdapter
。没有绑定表达式的属性(甚至是普通的XML值)将导致关联参数接收Java默认值。必须注意确保默认值不与有效的XML值混淆。
@BindingAdapter({"valueA", "valueB"}, requireAll = false)
public void setupSomethingElse(View view, int valueA, int valueB) {
if (valueA != 0) {
// do something with a
if (valueB != 0) {
// do something with a and b
}
}
}
所以你不再需要setupSomething()
了。但我个人更喜欢第一种方法。