美文网首页简化开发Android开发Android开发经验谈
Android开发EditText超出字数限制提醒 【致Andr

Android开发EditText超出字数限制提醒 【致Andr

作者: i小灰 | 来源:发表于2021-05-25 18:16 被阅读0次

当我们在Editext输入内容的时候,检测如果超过限制的长度无法输入内容,并且给用户提示。

首先我想到了下面的方法:

 editText.addTextChangedListener(new TextWatcher() {
            // Text改变前的回调解理
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            // Text改变中的回调解理
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (s.length() > 6){ //判断EditText中输入的字符数是不是已经大于6
                    editText.setText(s.toString().substring(0,6)); //设置EditText只显示前面6位字符
                    editText.setSelection(6);//让光标移至末端
                    Toast.makeText(MainActivity.this, "输入字数已达上限", 
                        Toast.LENGTH_SHORT).show();
                    return;
                }
            }
            // Text改变后的回调解理
            @Override
            public void afterTextChanged(Editable s) {
            }
        });

个人觉得这种体验或许不是很好,或许会出现EdiText闪动但是肉眼不仔细看看不出来。

其实我们可以用下面这种方法:

源码给Editext设置了过滤器,专门用来判断是否超出最大的字符长度,把这段过滤器取出来,在里面加上Toast提示,设置给Editext就可以了。

  class MyLengthFilter implements InputFilter {

        private final int mMax;
        private Context context;

        public MyLengthFilter(int max, Context context) {
            mMax = max;
            this.context = context;
        }

        public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
                                   int dstart, int dend) {
            int keep = mMax - (dest.length() - (dend - dstart));
            if (keep <= 0) {
                //这里,用来给用户提示
                Toast.makeText(context, "字数不能超过" + mMax, Toast.LENGTH_SHORT).show();
                return "";
            } else if (keep >= end - start) {
                return null; // keep original
            } else {
                keep += start;
                if (Character.isHighSurrogate(source.charAt(keep - 1))) {
                    --keep;
                    if (keep == start) {
                        return "";
                    }
                }
                return source.subSequence(start, keep);
            }
        }

        /**
         * @return the maximum length enforced by this input filter
         */
        public int getMax() {
            return mMax;
        }
    }

调用:

mEditext.setFilters(new InputFilter[]{new MyLengthFilter(100,context)});

源码中该方法是这样的:

public void setFilters(InputFilter[] filters) {
        if (filters == null) {
            throw new IllegalArgumentException();
        }

        mFilters = filters;

        if (mText instanceof Editable) {
            setFilters((Editable) mText, filters);
        }
    }

由此可见我们可以给Editext设置多个过滤器,例如过滤掉一些特殊字符,表情等等。

学习android有一个很重要的能力就是阅读源码的能力,很多问题都可以通过阅读源码找到解决方法。

EditText限制输入内容为1-100范围内的数字

首先在布局文件中,设置inputType为number,且maxLength=3;然后设置监听输入,代码如下

public TextWatcher inputWatch(final EditText input) {
        return new TextWatcher() {

            private String outStr = ""; //这个值存储输入超过两位数时候显示的内容

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                String edit=s.toString();
                if (edit.length()==2&&Integer.parseInt(edit)>=10){
                    outStr=edit;
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String words = s.toString();
                //首先内容进行非空判断,空内容(""和null)不处理
                if (!TextUtils.isEmpty(words)) {
                    //1-100的正则验证
                    Pattern p = Pattern.compile("^(100|[1-9]\\d|\\d)$");
                    Matcher m = p.matcher(words);
                    if (m.find() || ("").equals(words)) {
                        //这个时候输入的是合法范围内的值
                    } else {
                        if (words.length() > 2) {
                            //若输入不合规,且长度超过2位,继续输入只显示之前存储的outStr
                            input.setText(outStr);
                            //重置输入框内容后默认光标位置会回到索引0的地方,要改变光标位置
                            input.setSelection(2);
                        }
                        ToastUtil.showToast("请输入范围在1-100之间的整数");
                    }
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                //这里的处理是不让输入0开头的值
                String words = s.toString();
                //首先内容进行非空判断,空内容(""和null)不处理
                if (!TextUtils.isEmpty(words)) {
                    if (Integer.parseInt(s.toString()) <= 0) {
                        input.setText("");
                        ToastUtil.showToast("请输入范围在1-100之间的整数");
                    }
                }
            }
        };
    }

参考链接:https://blog.csdn.net/qq_26411333/article/details/51647888

相关文章

网友评论

    本文标题:Android开发EditText超出字数限制提醒 【致Andr

    本文链接:https://www.haomeiwen.com/subject/izecsltx.html