EditText限制输入字符类型的几种方式

转自http://blog.csdn.net/goodlixueyong/article/details/40655317

1、第一种方式是通过EditText的inputType来实现,可以通过xml或者java文件来设置。假如我要设置为显示密码的形式,可以像下面这样设置:

在xml中,   android:inputType="textPassword"

在java文件中,可以用 myEditText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

inputType 属性列表:

android:inputType="none"
    android:inputType="text"
    android:inputType="textCapCharacters" 字母大写
    android:inputType="textCapWords" 首字母大写
    android:inputType="textCapSentences" 仅第一个字母大写
    android:inputType="textAutoCorrect" 自动完成
    android:inputType="textAutoComplete" 自动完成
    android:inputType="textMultiLine" 多行输入
    android:inputType="textImeMultiLine" 输入法多行(如果支持)
    android:inputType="textNoSuggestions" 不提示
    android:inputType="textUri" 网址
    android:inputType="textEmailAddress" 电子邮件地址
    android:inputType="textEmailSubject" 邮件主题
    android:inputType="textShortMessage" 短讯
    android:inputType="textLongMessage" 长信息
    android:inputType="textPersonName" 人名
    android:inputType="textPostalAddress" 地址
    android:inputType="textPassword" 密码
    android:inputType="textVisiblePassword" 可见密码
    android:inputType="textWebEditText" 作为网页表单的文本
    android:inputType="textFilter" 文本筛选过滤
    android:inputType="textPhonetic" 拼音输入
//数值类型
    android:inputType="number" 数字
    android:inputType="numberSigned" 带符号数字格式
    android:inputType="numberDecimal" 带小数点的浮点格式
    android:inputType="phone" 拨号键盘
    android:inputType="datetime" 时间日期
    android:inputType="date" 日期键盘
    android:inputType="time" 时间键盘

 

2、第二种是通过android:digits 属性来设置,这种方式可以指出要显示的字符,比如我要限制只显示数字,可以这样:

        android:digits="0123456789"

如果要显示的内容比较多,就比较麻烦了,将要显示的内容依次写在里面。

3、通过正则表达式来判断。下面的例子只允许显示字母、数字和汉字。

public static String stringFilter(String str)throws PatternSyntaxException{     
      // 只允许字母、数字和汉字      
      String   regEx  =  "[^a-zA-Z0-9\u4E00-\u9FA5]";                     
      Pattern   p   =   Pattern.compile(regEx);     
      Matcher   m   =   p.matcher(str);     
      return   m.replaceAll("").trim();     
  }

 

然后需要在TextWatcher的onTextChanged()中调用这个函数,

@Override  
      public void onTextChanged(CharSequence ss, int start, int before, int count) {  
          String editable = editText.getText().toString();  
          String str = stringFilter(editable.toString());
          if(!editable.equals(str)){
              editText.setText(str);
              //设置新的光标所在位置  
              editText.setSelection(str.length());
          }
      }  

 

4、通过InputFilter来实现。

实现InputFilter过滤器,需要覆盖一个叫filter的方法。

public abstract CharSequence filter ( 

    CharSequence source,  //输入的文字 

    int start,  //开始位置 

    int end,  //结束位置 

    Spanned dest, //当前显示的内容 

    int dstart,  //当前开始位置 

    int dend //当前结束位置 

);

下面的实现使得EditText只接收字符(数字、字母和汉字)和“-”“_”,Character.isLetterOrDigit会把中文也当做Letter。

editText.setFilters(new InputFilter[] { 

new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
            for (int i = start; i < end; i++) { 
                    if ( !Character.isLetterOrDigit(source.charAt(i)) && !Character.toString(source.charAt(i)) .equals("_") && !Character.toString(source.charAt(i)) .equals("-")) { 
                            return ""; 
                    } 
            } 
            return null; 
    }  }); 

 

 

另外使用InputFilter还能限制输入的字符个数,如

        

EditText tv =newEditText(this); 
        int maxLength =10; 
        InputFilter[] fArray =new InputFilter[1]; 
        fArray[0]=new  InputFilter.LengthFilter(maxLength); 
        tv.setFilters(fArray);

 

上面的代码可以限制输入的字符数最大为10。

在项目过程中,遇到身份证需要过滤输入数据的情况:前十七位为数字,最后一位有可能为数字也有可能为x:

代码如下

etIdCard2.setFilters(new InputFilter[]{
                new InputFilter() {
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                        for (int i=start;i<end;i++){
                            if(!Character.isDigit(source.charAt(i))){
                                common.Log(" i="+i);
                                common.Log(" start="+start+"  end="+end+"  dstart="+dstart+"  dend="+dend);
                                if (dstart==17&&Character.toString(source.charAt(i)).equals("x")||Character.toString(source.charAt(i)).equals("X")){
                                    return "x";
                                }else {
                                    return "";
                                }
                            }
                        }
                        return null;
                    }
                },
                new InputFilter.LengthFilter(18)//限定长度为18
        });

 

posted @ 2016-01-24 23:54  戎码之路  阅读(750)  评论(0)    收藏  举报