如何在Android中将NumberFormat与2向数据绑定一起使用?

时间:2019-08-27 08:50:58

标签: java android binding

我正在尝试格式化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;
    }
}

formatter-是一个NumberFormat对象。

但是,当我开始在应用程序中键入数字时,以某种方式设置值的格式(例如,应用了千位分隔符)时,光标会移至数字的开头。如何防止这种行为?
可能只有在视图失去焦点时才可以应用更改,但是我不知道当必须应用更改时如何说绑定。

1 个答案:

答案 0 :(得分:0)

最后找到了解决方案(可能还不够好,但是可以正常工作)。

我是使用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);
}