ObservableInt不在BindingAdapter中更新

时间:2016-10-05 13:26:41

标签: android android-databinding

我有这个可观察的int,在我的POJO类对象上有正确的setter和getter:

private ObservableInt pressure = new ObservableInt();

public ObservableInt getPressure()
{
    return pressure;
}

public void setPressure(ObservableInt pressure)
{
    this.pressure = pressure;
    setPressureValidation(isPressureValid());
}

要在EditText上使用此压力变量,我必须创建此适配器:

@BindingAdapter("android:text")
public static void bindIntegerInText(AppCompatEditText editText, ObservableInt value)
{
    editText.setText(String.valueOf(value.get()));

    // Set the cursor to the end of the text
    editText.setSelection(editText.getText().length());
}

@InverseBindingAdapter(attribute = "android:text")
public static int getIntegerFromBinding(TextView view)
{
    String string = view.getText().toString();

    return string.isEmpty() ? 0 : Integer.parseInt(string);
}

现在,我有这个功能来检查压力是否有效:

public boolean isPressureValid()
{
    return ( (pressure.get() >= 2) && (pressure.get() <= 8) );
}

问题是当我在我的xml上尝试这个时,这个函数(isPressureValid)在开始时只执行一次。这是我的xml:

<android.support.v7.widget.AppCompatEditText
        android:layout_width="@dimen/visit_report_item_width"
        android:layout_height="@dimen/agro_item_height"
        android:layout_weight="1"
        bind:setEditTextColor="@{field.agroValuesModel.pressureValidation}"
        android:inputType="numberDecimal"
        android:id="@+id/agro_row_pressure"


android:text="@=field.agroValuesModel.pressure}"android:textColor="@{field.agroValuesModel.isPressureValid() ? @color/colorPrimary : @color/main_color_accent_red}"
    android:gravity="center_horizontal"/>

我已经尝试过使用一个名为&#34; pressureValidation&#34;的布尔值。并在压力设定器上使用notifyPropertyChanged(BR.pressureValidation),然后在android:textColor上使用它,如下所示:

android:textColor="@{field.agroValuesModel.pressureValid ? @color/colorPrimary : @color/main_color_accent_red}"

但这也没有奏效。似乎没有使用压力ObservableInt变量的setter。有人对这类问题有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你真的不需要POJO。只需使用您需要的可绑定属性创建视图模型。 ObservableInt为您完成所有操作,并将其视为int

public class Pressure {
    public final ObservableInt value = new ObservableInt();
}

在您的布局中,您只需要设置binding:textValue="@={pressure.value}"。使用android:text也是可能的,但不是太好,因为设置int应保持默认行为。

@BindingAdapter("textValue")
public static void bindIntegerInText(TextView text, int value) {
    text.setText(String.valueOf(value));
    // Set the cursor to the end of the text
    text.setSelection(text.getText().length());
}

如果要对文本颜色使用验证,则必须在那里使用可观察的表达式。在你的情况下,它在开始时只被评估一次,因为数据绑定对验证的基础价值一无所知。

您可以向ObservableBoolean isValid添加Pressure,并在value更改时随时更新其值。为此,您可以注册自己的Observable.OnPropertyChangedCallbackvalue并在其中设置isValid

答案 1 :(得分:0)

使用ObservableX对象时,在XML中引用对象本身而不是getter方法:

ObservableMap<String, Object> item = new ObservableArrayMap<>();
item.put("price", "$33.41");

XML:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text='@{item["price"]}'/>

或者扩展BaseObservable并使用getter:

public class Item extends BaseObservable {
    private String price;

    @Bindable
    public String getPrice() {
        return this.name;
    }

    public void setPrice(String price) {
        this.price = price;
        notifyPropertyChanged(BR.price);
    }
}

XML:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@{item.price}"/>