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