android - 如何实现android.text.InputType
问题描述
我刚刚开发了以下课程:
class LocalizedNumberInputFilter implements InputFilter
{
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String destText = dest.toString();
String destPrefix = dstart > 0 ? destText.substring(0, dstart) : "";
String destSuffix = dend > 0 ? destText.substring(dend) : destText;
String srcText = source.toString().substring(start, end);
String result = destPrefix + srcText + destSuffix;
Double parsed = FarayanUtility.TryParseDouble(result);
if (parsed == null) {
return "";
}
String grouped = NumberFormat.getInstance().format(parsed);
String localized = localNumberProvider.Localize(grouped);
return localized;
}
}
并将 EditText 过滤器设置为
setFilters(new InputFilter[]{new LocalizedNumberInputFilter()});
对用户输入的文本进行分组和本地化。如下表:
用户输入---->显示文本
1 ----> 1
12 ----> 12
123---->123
1234 ----> 1,234
等等。
但是用户输入后什么都不会显示
解决方案
如果您想在应用程序文本输入中包含波斯/阿拉伯数字,您有两种选择:
- 使用带有修改数字的字体
- 使用 TextWatcher 类来格式化您的输入
对于第二个选项:
public class NumberTextWatcher implements TextWatcher {
private DecimalFormat df; // With fraction
private DecimalFormat dfnd; // without fraction
private boolean hasFractionalPart;
private Number number;
private EditText et;
public NumberTextWatcher(EditText et)
{
df = new DecimalFormat("#,###.##");
df.setDecimalSeparatorAlwaysShown(true);
dfnd = new DecimalFormat("#,###");
this.et = et;
hasFractionalPart = false;
}
@Override
public void afterTextChanged(Editable s)
{
// VERY IMPORTANT
et.removeTextChangedListener(this);
try {
int inilen, endlen;
inilen = et.getText().length();
String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "");
number = df.parse(v);
int cp = et.getSelectionStart();
if (hasFractionalPart) {
et.setText(df.format(number));
} else {
et.setText(dfnd.format(number));
}
endlen = et.getText().length();
int sel = (cp + (endlen - inilen));
if (sel > 0 && sel <= et.getText().length()) {
et.setSelection(sel);
} else {
// place cursor at the end?
et.setSelection(et.getText().length() - 1);
}
} catch (NumberFormatException nfe) {
// do nothing?
} catch (ParseException e) {
// do nothing?
}
// VERY IMPORTANT
et.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
{
hasFractionalPart = true;
} else {
hasFractionalPart = false;
}
}
public Long getLongNumber() {
return number.longValue();
}
}
推荐阅读
- xml - XML to csv 做正确的 xslt
- php - Laravel socalite - 永远不会触发 handleProviderCallback
- android - 一段时间后呼叫检测广播接收器停止在后台工作
- ruby-on-rails-5 - 当代码不正确时应该引发错误
- spring - 如何在 intellij 中创建 gradle 和 spring 项目(终极版)
- android - Android:回收站视图的用户界面在项目点击时不会改变?
- sql - 仅显示行之间差异的 T-SQL 查询
- vue.js - 承诺 {
} 关于观看 Vuex 动作 - javascript - 在函数内声明和解析的 Promise 无法正确执行
- python - 有没有办法在不使用条件语句的情况下反转字符串?