zoukankan      html  css  js  c++  java
  • EditText超出字数限制,给用户提示

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

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

     editText.addTextChangedListener(new TextWatcher() {
                @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.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; } } @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有一个很重要的能力就是阅读源码的能力,很多问题都可以通过阅读源码找到解决方法。

    参考链接:https://blog.csdn.net/qq_26411333/article/details/51647888http://77blogs.com/?p=554

  • 相关阅读:
    activeMQ
    读写xml
    PLSQL
    oracle语法
    cxf远程调用服务
    FastDFS在linux下的安装和整合nginx实现上传图片和url访问
    dubbo和zookeeper的应用
    solr和Lucene的配置方式和应用
    win10 下安装 MongoDB 数据库支持模块(python)
    nodeJs 对 Mysql 数据库的 curd
  • 原文地址:https://www.cnblogs.com/tangZH/p/9642734.html
Copyright © 2011-2022 走看看