美文网首页Android技术
Android 字符串过滤器InputFilter详解

Android 字符串过滤器InputFilter详解

作者: IT一书生 | 来源:发表于2018-03-19 23:04 被阅读941次

    概述

    InputFilter是系统提供的一个接口,里面只有一个方法filter(),用于过滤输入/插入的字符串,返回值为CharSequence。 一般都是通过判断语句来过滤字符串,在这里 InputFilter 是另外一种实现方式。

    实现

    • 代码
    /******************************* 输入框关联 *********************************/
    et02.setFilters(filter);
    
    /**********************************调用**************************************/
    
        private InputFilter[] filter = new InputFilter[] {
    
                new InputFilter() {
                    /**
                     * @param source 输入的文字
                     * @param start 输入-0,删除-0
                     * @param end 输入-文字的长度,删除-0
                     * @param dest 原先显示的内容
                     * @param dstart 输入-原光标位置,删除-光标删除结束位置
                     * @param dend  输入-原光标位置,删除-光标删除开始位置
                     * @return
                     */
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                        System.out.println("source  =="+ source+"  start====="+start+"   end======"+end+"   dest===="+dest+"  dstart==="+dstart+"  dend=="+dend);
                        return null;
                    }
                }
        };
    
    • Log
    /*******************************输入********************************/
    09-09 09:30:18.977 10843-10843/zp.example.zptext I/System.out: source  ==我  start=====0   end======1   dest====  dstart===0  dend==0
    09-09 09:30:21.873 10843-10843/zp.example.zptext I/System.out: source  ==喜欢  start=====0   end======2   dest====我  dstart===1  dend==1
    09-09 09:30:26.817 10843-10843/zp.example.zptext I/System.out: source  ==湖畔  start=====0   end======2   dest====我喜欢  dstart===3  dend==3
    09-09 09:31:10.265 10843-10843/zp.example.zptext I/System.out: source  ==的  start=====0   end======1   dest====我喜欢湖畔  dstart===5  dend==5
    
    /************************************删除*****************************/
    09-09 09:33:08.089 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我喜欢湖畔的  dstart===5  dend==6
    09-09 09:33:22.341 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我喜欢湖畔  dstart===4  dend==5
    09-09 09:33:27.733 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我喜欢湖  dstart===3  dend==4
    09-09 09:33:30.269 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我喜欢  dstart===2  dend==3
    09-09 09:33:31.485 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我喜  dstart===1  dend==2
    09-09 09:33:32.777 10843-10843/zp.example.zptext I/System.out: source  ==  start=====0   end======0   dest====我  dstart===0  dend==1
    
    • 使用
    private InputFilter[] filter = new InputFilter[] {
                new InputFilter() {
                    /**
                     * @param source 输入的文字
                     * @param start 输入-0,删除-0
                     * @param end 输入-文字的长度,删除-0
                     * @param dest 原先显示的内容
                     * @param dstart 输入-原光标位置,删除-光标删除结束位置
                     * @param dend  输入-原光标位置,删除-光标删除开始位置
                     * @return
                     */
                    // 不让输入框输入内容
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                        return null;
                    }
                },
                /**这里限制输入的长度为5个字母*/
                new InputFilter.LengthFilter(5),
                /**输入小写转换成大写*/
                new InputFilter.AllCaps()
        };
    

    实例一

          // 只要你输入内容都会替换成“I LOVE YOU”,删除 - 正常删除
          @Override
           public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                  if (end > 0){
                       return "I LOVE YOU";
                  }else {
                       return null;
                  }
            }
    

    实例二

    // 控制不让输入空格,不让输入数字大于13位(解决手机号输入问题)
    @Override
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
           if(source.equals(" ") || source.toString().contentEquals("\n") || dstart == 13)return "";
            else return null;
     }
    

    实例三

    // 不让输入框输入内容(禁止输入)
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        return dest.subSequence(dstart,dend);
    }
    

    实例四

    类似临摹,输入字符正确则正常输入,不正确则用 x 代替

    /*****************************配置******************************/
    private final String str = "Hello,Android!";
    
    et03.setFilters(new InputFilter[]{ new MyInputFilter(str) });
    
    /***************************代码实现***************************/
    
    public class MyInputFilter implements InputFilter {
    
            String str = null;
    
            public MyInputFilter(String str) {
                this.str = str;
            }
            @Override
            public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
                String ch = null;
                if (dest.length() < str.length()) {
                    ch = str.substring(dstart + start, dstart + end);
                } else {
                    return dest.subSequence(dstart, dend);
                }
                if (ch.equals(src)) {
                    Toast.makeText(TextWatchActivity.this, "match", Toast.LENGTH_SHORT).show();
                    return dest.subSequence(dstart, dend) + src.toString();
                } else {
                    Toast.makeText(TextWatchActivity.this, "mismatch", Toast.LENGTH_SHORT).show();
                    return dest.subSequence(dstart, dend) + "×";
                }
            }
        }
    

    实例五

           /**只允许输入某些字符*/
            et03.setKeyListener(new NumberKeyListener() {
                @Override
                public int getInputType() {
                    return InputType.TYPE_MASK_VARIATION;
                }
                /**这里实现字符串过滤,把你允许输入的字母添加到下面的数组即可!*/
                @Override
                protected char[] getAcceptedChars() {
                    return new char[]{'0','1','2','3'};
                }
            });
    

    实例六

    实时格式化金额,三位一断

    /*******************************配置************************************/
    
    et03.setFilters(new InputFilter[]{lengthfilter2});
    
    /*******************************实现************************************/
    
    private DecimalFormat myformat = new DecimalFormat("###,###");  //金额的格式
    
        private InputFilter lengthfilter2 = new InputFilter() {
    
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                // 删除等特殊字符,直接返回
                // "".equals(source.toString():不添加会出现删除不了内容的情况
                if (source.toString() == null || source.toString().contains(".") || "".equals(source.toString())) {
                    return null;
                }
                String dValue = dest.toString();
                if (dValue != null && dValue.contains(",")) {
                    dValue = dValue.replace(",", "");
                }
                if (dValue != null && dValue.length() > 2 && !dValue.contains(",")) {
                    String newValue = dValue + source;
                    String amountStr = myformat.format(Double.parseDouble(newValue));
                    et03.setText("");
                    et03.setText(amountStr);
                    et03.setSelection(amountStr.length());
                    return amountStr;
                } else {
                    return null;
                }
            }
        };
    

    相关文章

      网友评论

        本文标题:Android 字符串过滤器InputFilter详解

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