EditText动态设置输入类型与过滤器的使用
在项目中,出于需要对 EditText
的长度以及输入类型进行动态改变,自己通过设置 EditText
类中的 setInputType
与 setFilters
方法来实现这一功能。
例子一:设置纯数字类型,并且限制数字长度。
// 设置输入的类型为数字
// 等价于xml中属性 android:inputType="number"
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
// 限制输入长度限制(当前设置为5)
// 使用系统自带的InputFilter接口类中的LengthFilter子类来完成的
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(5)});
例子二:设置带小数类型,限制小点前后数字长度。
// 设置输入的类型为带小数类型
// 等价于xml中属性 android:inputType="numberDecimal"
editText.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
// 限制小点前后数字长度(当前设置为前5后2)
// 通过实现InputFilter接口来完成长度的限制
editText.setFilters(new InputFilter[] {new DecimalInputFilter(5, 2)});
DecimalInputFilter 类的实现
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
/**
* Created by sky on 16-9-2.
*/
public class DecimalInputFilter implements InputFilter {
private String mRegularExpression;
public DecimalInputFilter() {
this(5);
}
public DecimalInputFilter(int firstLength) {
this(firstLength, 2);
}
public DecimalInputFilter(int firstLength, int lastLength) {
mRegularExpression = String.format("(\\d{0,%d}(\\.\\d{0,%d})?)", firstLength, lastLength);
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean delete = false;
StringBuilder builder = new StringBuilder(dest);
if (TextUtils.isEmpty(source)) {
delete = true;
builder.delete(dstart, dend);
} else {
builder.insert(dstart, source);
}
String value = builder.toString();
return value.matches(mRegularExpression) ? null : delete ? "." : "";
}
}
注:代码中的
delete
变量主要出于在单独选择.
进行删除操作成特意添加的,当删除.
时小数点前面的数字长度超出时程序在阻止其进行删除.
的操作。