我可以使BindingAdapters具有重叠的值集吗?

时间:2017-05-15 20:04:40

标签: android android-databinding

假设我有这种使用方法的视图模型:

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,但这对我来说有点可疑(并且部分地破坏了数据绑定的目的)。

1 个答案:

答案 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()了。但我个人更喜欢第一种方法。