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
这里拿“高仿微信输入框”举个例子
- package com.iscs.mobilewcs.tools;
- import android.text.InputFilter;
- import android.text.Spanned;
- import android.text.TextUtils;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- * Created by Jackie on 2017/2/22.
- * 过滤用户输入只能为金额格式
- */
- public class CashierInputFilter implements InputFilter {
- Pattern mPattern;
- //输入的最大金额
- private static final int MAX_VALUE = Integer.MAX_VALUE;
- //小数点后的位数
- private static final int POINTER_LENGTH = 2;
- private static final String POINTER = ".";
- private static final String ZERO = "0";
- public CashierInputFilter() {
- mPattern = Pattern.compile("([0-9]|\\.)*");
- }
- /**
- * @param source 新输入的字符串
- * @param start 新输入的字符串起始下标,一般为0
- * @param end 新输入的字符串终点下标,一般为source长度-1
- * @param dest 输入之前文本框内容
- * @param dstart 原内容起始坐标,一般为0
- * @param dend 原内容终点坐标,一般为dest长度-1
- * @return 输入内容
- */
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
- String sourceText = source.toString();
- String destText = dest.toString();
- //验证删除等按键
- if (TextUtils.isEmpty(sourceText)) {
- return "";
- }
- Matcher matcher = mPattern.matcher(source);
- //已经输入小数点的情况下,只能输入数字
- if(destText.contains(POINTER)) {
- if (!matcher.matches()) {
- return "";
- } else {
- if (POINTER.equals(source.toString())) { //只能输入一个小数点
- return "";
- }
- }
- //验证小数点精度,保证小数点后只能输入两位
- int index = destText.indexOf(POINTER);
- int length = dend - index;
- if (length > POINTER_LENGTH) {
- return dest.subSequence(dstart, dend);
- }
- } else {
- /**
- * 没有输入小数点的情况下,只能输入小数点和数字
- * 1. 首位不能输入小数点
- * 2. 如果首位输入0,则接下来只能输入小数点了
- */
- if (!matcher.matches()) {
- return "";
- } else {
- if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) { //首位不能输入小数点
- return "";
- } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位输入0,接下来只能输入小数点
- return "";
- }
- }
- }
- //验证输入金额的大小
- double sumText = Double.parseDouble(destText + sourceText);
- if (sumText > MAX_VALUE) {
- return dest.subSequence(dstart, dend);
- }
- return dest.subSequence(dstart, dend) + sourceText;
- }
- }
使用方法:
在需要做EditText的类做如下操作
InputFilter[] is = {new CashierInputFilter()};其中edu为我们自己创建的edu.setFilters(is);EditText 引用的ID