[英]How to use NumberFormat with 2-way data binding in android?
我正在尝试格式化editable
TextInputEditText
值。 想法是在用户输入值时显示千位分隔符。
我有一些BigDecimal值,并创建了转换器以应用格式将其转换为字符串:
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/my_hint"
android:inputType="numberDecimal"
android:text="@={MyConverters.amountToString(obj.value)}"
/>
@InverseMethod("stringToAmount")
public static String amountToString(BigDecimal value){
if (value == null) {
return null;
}
return formatter.format(value);
}
public static BigDecimal stringToAmount(String value){
if (value == null){
return null;
}
try {
Number num = formatter.parse(value);
BigDecimal result = new BigDecimal(num.doubleValue());
return result;
} catch(ParseException | NumberFormatException ex) {
return null;
}
}
格式化程序-是一个NumberFormat对象。
但是,当我开始在应用程序中键入数字时,如果以某种方式设置了值的格式(例如,应用了千位分隔符),则光标会移至数字的开头。 如何防止这种行为?
可能只有在视图失去焦点时才可以应用更改,但是当必须应用更改时,我不知道该怎么说。
终于找到了解决方案(可能还不够好,但是行得通)。
我使用BindingAdapters做到了:
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/my_hint"
android:inputType="numberDecimal"
android:text="@={obj.value}" />
@BindingAdapter("android:text")
public static void bindBigDecimalInText(EditText editText, BigDecimal oldValue,
BigDecimal newValue) {
if (oldValue == null && newValue == null) {
return;
}
if (oldValue != null && newValue != null && oldValue.equals(newValue)) {
return;
}
editText.setText(amountToString(newValue));
editText.setSelection(editText.getText().length());
}
@InverseBindingAdapter(attribute = "android:text")
public static BigDecimal getBigDecimalFromBinding(TextView view) {
String string = view.getText().toString();
return stringToAmount(string);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.