繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM