一行代码实现EditText数字输入逗号和位数限制

版权声明:转载请著名AndroidMsky和原文链接。 https://blog.csdn.net/AndroidMsky/article/details/70226641

这里写图片描述

我们可能面临这样的需求EditText输入限制n位整数,n位小数。有些产品,提出了整数要根据三个数来加逗号。笔者也是找了半天没有找到太好的工具类,于是自己封装了一个。

实现功能:
1.3位自动加逗号
2.自定义限制输入位数
3.支持在串的任意位置增加,修改,删除。
4.对空和有内容进行回调封装
5.对输入结束后进行回调封装

使用方法:

//10位整数两位小数
EditTextTools editTextTools= new EditTextTools(mEditText,10,2);

如果需要45两个需求的回调:

editTextTools.setOnEmptyListener(new EditTextTools.OnEmptyListener() {
            @Override
            public void onEmpty() {

            }

            @Override
            public void onNoEmpty() {

            }
        });
        editTextTools.setOnBeforeAfterChangedListener(new EditTextTools.OnBeforeAfterChangedListener() {
            @Override
            public void onBeforeAfterChanged(String s) {

            }
        });

解释一下45两个需求为什么会存在,
4因为我们可能对数字采用特殊字体等,但是如果有hint那么汉字是没有被加入特殊字体库的,所以空的时候就用默认字体,有输入可能用特殊的自定义字体(一套数字英文自定义字体文件大小还是可以接受的)。
5我们输入的数据可能会想实时保存下来那我我们可能需要对串中的逗号进行剔除等,所以定义了这个借口。

然后我们罗列一下几个难点:
1.输入修改位置计算,因为我们可能自己增加逗号进去,所以位置可能会错乱。
2.如何避免多次回调TextWatcher
3.如何处理好数字串的限制长度和增加字符

12可能都是Android的一些技巧,

1.通过onTextChanged(CharSequence s, int start, int before, int count)
几个回调的值,来处理setSelection。

2.我们在给EditText赋值text时候解除监听,赋值后继续添加监听

mEditText.removeTextChangedListener(this);

3也就是Java字符串处理的基本功了。就不细说了具体可以看代码。

最后贴出工具类代码:

public class EditTextTools {

    EditText mEditText;
    int zhengshu = 10;
    int xiaoshu = 10;
    OnBeforeAfterChangedListener mOnBeforeAfterChangedListener;
    OnEmptyListener mOnEmptyListener;

    public EditTextTools(EditText e, int zhengshu, int xiaoshu) {
        this.zhengshu = zhengshu;
        this.xiaoshu = xiaoshu;
        mEditText = e;
        mEditText.addTextChangedListener(mTextWatcher);
    }

    public void setOnEmptyListener(OnEmptyListener onEmptyListener) {
        this.mOnEmptyListener = onEmptyListener;
    }


    public void setOnBeforeAfterChangedListener(OnBeforeAfterChangedListener onBeforeAfterChangedListener) {
        this.mOnBeforeAfterChangedListener = onBeforeAfterChangedListener;
    }


    public static int appearNumber(String srcText, String findText) {
        int count = 0;
        Pattern p = Pattern.compile(findText);
        Matcher m = p.matcher(srcText);
        while (m.find()) {
            count++;
        }
        return count;
    }


    final TextWatcher mTextWatcher = new TextWatcher() {
        int zongdou = 0;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            zongdou = appearNumber(s.toString(), ",");
            int dou = 0;
            int chadou = 0;
            if (count != before) {
                String sss = "";
                String string = s.toString().replace(",", "");
                String string2 = "";
                int dianwei = string.indexOf('.');

                if (dianwei != -1) {
                    string2 = string.substring(dianwei);
                    string = string.substring(0, dianwei);
                    if (string2.length() > xiaoshu + 1) string2 = string2.substring(0, xiaoshu + 1);
                }

                if (string.length() > zhengshu) string = string.substring(0, zhengshu);
                int b = string.length() / 3;
                if (string.length() >= 0) {
                    int yushu = string.length() % 3;
                    if (yushu == 0) {
                        b = string.length() / 3 - 1;
                        yushu = 3;
                    }
                    for (int i = 0; i < b; i++) {
                        sss = sss + string.substring(0, yushu) + "," + string.substring(yushu, 3);
                        string = string.substring(3, string.length());
                    }
                    sss = sss + string;
                    mEditText.removeTextChangedListener(this);
                    if (dianwei != -1)
                        mEditText.setText(sss + string2);
                    else mEditText.setText(sss);
                    dou = appearNumber(mEditText.getText().toString(), ",");
                    chadou = dou - zongdou;
                    mEditText.addTextChangedListener(this);
                }

                Log.d(":::::::::::::::::", start + "   " + before + "    " + count);
            }
            if (start + count + chadou > mEditText.getText().length())
                mEditText.setSelection(mEditText.getText().length());
            else mEditText.setSelection(start + count + chadou);

            if (mOnBeforeAfterChangedListener != null) {
                mOnBeforeAfterChangedListener.onBeforeAfterChanged(mEditText.getText().toString());
            }

        }

        @Override
        public void afterTextChanged(Editable s) {


            if (s.length() > 0)

            {
                if (mOnEmptyListener != null) {
                    mOnEmptyListener.onNoEmpty();
                }
            } else

            {
                if (mOnEmptyListener != null) {
                    mOnEmptyListener.onEmpty();
                }
            }


        }
    };

    public interface OnBeforeAfterChangedListener {
        public void onBeforeAfterChanged(String s);

    }

    public interface OnEmptyListener {
        public void onEmpty();
        public void onNoEmpty();

    }


}

或许可能完善这个EditTextTools搞一个集合,大家可以提出自己的意见。

欢迎关注作者。欢迎评论讨论。欢迎拍砖。 如果觉得这篇文章对你有帮助,欢迎打赏, 欢迎star,Fork我的github。
喜欢作者的也可以Follow。也算对作者的一种支持。
本文Github代码链接

https://github.com/AndroidMsky/EditTextTools

欢迎加作者自营安卓开发交流群:308372687

猜你喜欢

转载自blog.csdn.net/AndroidMsky/article/details/70226641
今日推荐