Android 中的InputFilter



EditText在安卓中是经常需要用到的。但是简单的EditText实际开发中的很难满足产品的需求,比如微信输入金额的EditText,里面对输入额度的限制有很多,如,保存小数点后两位,第一个数字为0的时候,后面只能输入“.”,这个时候,EditText 的InputType是没法满足这样的需求,所以我们就要借助于InputFilter。


其他需求例如:过滤一些敏感的字眼,他的使用方法如下

创建一个类  implements  InputFilter接口  需要重写其中的一个方法


public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    return null;
}

这个方法中的参数代表具体如下:

source    新输入的字符串    
start 新输入的字符串起始下标,一般为0
end 新输入的字符串终点下标,一般为source长度-1
dest 输入之前文本框内容
dstart 原内容起始坐标,一般为0
dend 原内容终点坐标,一般为dest长度-1
这里拿“高仿微信输入框”举个例子
 
  
  1. package com.iscs.mobilewcs.tools;  
  2.   
  3. import android.text.InputFilter;  
  4. import android.text.Spanned;  
  5. import android.text.TextUtils;  
  6.   
  7. import java.util.regex.Matcher;  
  8. import java.util.regex.Pattern;    
  9.     
  10. /**  
  11.  * Created by Jackie on 2017/2/22. 
  12.  * 过滤用户输入只能为金额格式  
  13.  */    
  14. public class CashierInputFilter implements InputFilter {  
  15.     Pattern mPattern;    
  16.   
  17.     //输入的最大金额    
  18.     private static final int MAX_VALUE = Integer.MAX_VALUE;    
  19.     //小数点后的位数    
  20.     private static final int POINTER_LENGTH = 2;    
  21.     
  22.     private static final String POINTER = ".";    
  23.     
  24.     private static final String ZERO = "0";  
  25.   
  26.     public CashierInputFilter() {  
  27.         mPattern = Pattern.compile("([0-9]|\\.)*");    
  28.     }    
  29.     
  30.     /**  
  31.      * @param source    新输入的字符串  
  32.      * @param start     新输入的字符串起始下标,一般为0  
  33.      * @param end       新输入的字符串终点下标,一般为source长度-1  
  34.      * @param dest      输入之前文本框内容  
  35.      * @param dstart    原内容起始坐标,一般为0  
  36.      * @param dend      原内容终点坐标,一般为dest长度-1  
  37.      * @return          输入内容  
  38.      */    
  39.     @Override    
  40.     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {    
  41.         String sourceText = source.toString();    
  42.         String destText = dest.toString();  
  43.     
  44.         //验证删除等按键    
  45.         if (TextUtils.isEmpty(sourceText)) {    
  46.             return "";    
  47.         }    
  48.     
  49.         Matcher matcher = mPattern.matcher(source);    
  50.         //已经输入小数点的情况下,只能输入数字    
  51.         if(destText.contains(POINTER)) {    
  52.             if (!matcher.matches()) {    
  53.                 return "";    
  54.             } else {    
  55.                 if (POINTER.equals(source.toString())) {  //只能输入一个小数点  
  56.                     return "";    
  57.                 }    
  58.             }    
  59.     
  60.             //验证小数点精度,保证小数点后只能输入两位    
  61.             int index = destText.indexOf(POINTER);    
  62.             int length = dend - index;    
  63.     
  64.             if (length > POINTER_LENGTH) {    
  65.                 return dest.subSequence(dstart, dend);  
  66.             }    
  67.         } else {  
  68.             /** 
  69.              * 没有输入小数点的情况下,只能输入小数点和数字 
  70.              * 1. 首位不能输入小数点 
  71.              * 2. 如果首位输入0,则接下来只能输入小数点了 
  72.              */  
  73.             if (!matcher.matches()) {    
  74.                 return "";    
  75.             } else {    
  76.                 if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) {  //首位不能输入小数点  
  77.                     return "";  
  78.                 } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位输入0,接下来只能输入小数点  
  79.                     return "";  
  80.                 }  
  81.             }    
  82.         }    
  83.     
  84.         //验证输入金额的大小  
  85.         double sumText = Double.parseDouble(destText + sourceText);  
  86.         if (sumText > MAX_VALUE) {    
  87.             return dest.subSequence(dstart, dend);    
  88.         }    
  89.     
  90.         return dest.subSequence(dstart, dend) + sourceText;    
  91.     }    
使用方法:
在需要做EditText的类做如下操作
	
InputFilter[] is = {new CashierInputFilter()};
edu.setFilters(is);

其中edu为我们自己创建的
EditText  引用的ID
 
  

你可能感兴趣的:(Android 中的InputFilter)