我有这个可观察的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。有人对这类问题有什么建议吗?
答案 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.OnPropertyChangedCallback
至value
并在其中设置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}"/>