首页 > 解决方案 > 如何实现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

等等。

但是用户输入后什么都不会显示

标签: androidtext

解决方案


如果您想在应用程序文本输入中包含波斯/阿拉伯数字,您有两种选择:

  • 使用带有修改数字的字体
  • 使用 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();
    }

}

推荐阅读