这两天产品有一个需求。
价格.jpg左右都是editText
最低价价格有上限,价格不能高于最高价。
自定义一个customeEditText继承EditText,实现一个inputFilter
inputFilter对插入的值进行检查,
如果合法,return null
如果不合法 retrun ""
this.setFilters(new InputFilter[]{moneyInputFilter, new
InputFilter.LengthFilter(LENGTH)});
private InputFilter moneyInputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String inputStr = dest.toString() + source.toString();
int inputInt = NumberUtils.parseStrToInt(inputStr);
if (maxValue < inputInt) {
return "";
}
return null;
}
};
source | start | end | dest | dstart | dend |
---|---|---|---|---|---|
要插入到edittext里的字符 | 插入字符开始位置,0开始 | 插入字符结束位置 | edittext里已经有的字符 | edittext里光标的开始位置 | edittext里光标结束的位置 |
dstart和dend的含义,inputfilter里的说明我没看懂。经我测试后,大部分情况下这两个值是相同的。在按删除的时候dstart比dend值小1
endinput.gif用户在数值末尾输入,能对数值正常检查
middleinput.gif假如用户光标移动到中间再输入一个5,5545,大于最大值5455,(这里的示意图逻辑我已经处理过)如果按照上面的逻辑,这个5会被加到末尾,数值是5455,仍然可以输入的。但是这明显不符合需求
修改逻辑
private InputFilter moneyInputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
StringBuilder sb = new StringBuilder(dest);
sb.insert(dstart, source);
int inputInt = NumberUtils.parseStrToInt(sb.toString());
if (maxValue < inputInt) {
ToastMaster.show(getContext(),"输入价格超出了最大价格");
return "";
}
return null;
}
};
这种方式,将用户输入的值插入到光标位置,再进行数值检查。
测试了几种情况,是满足需求的。
然而,加了这个inputFilter以后,再设置maxLength,不管用了。
需要自己增加length的filter
this.setFilters(new InputFilter[]{moneyInputFilter, new InputFilter.LengthFilter(LENGTH)});
网友评论