這兩天產(chǎn)品有一個(gè)需求。
價(jià)格.jpg
左右都是editText
最低價(jià)價(jià)格有上限,價(jià)格不能高于最高價(jià)。
自定義一個(gè)customeEditText繼承EditText,實(shí)現(xiàn)一個(gè)inputFilter
inputFilter對(duì)插入的值進(jìn)行檢查,
如果合法,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里的字符 | 插入字符開(kāi)始位置,0開(kāi)始 | 插入字符結(jié)束位置 | edittext里已經(jīng)有的字符 | edittext里光標(biāo)的開(kāi)始位置 | edittext里光標(biāo)結(jié)束的位置 |
dstart和dend的含義,inputfilter里的說(shuō)明我沒(méi)看懂。經(jīng)我測(cè)試后,大部分情況下這兩個(gè)值是相同的。在按刪除的時(shí)候dstart比dend值小1
endinput.gif
用戶(hù)在數(shù)值末尾輸入,能對(duì)數(shù)值正常檢查
middleinput.gif
假如用戶(hù)光標(biāo)移動(dòng)到中間再輸入一個(gè)5,5545,大于最大值5455,(這里的示意圖邏輯我已經(jīng)處理過(guò))如果按照上面的邏輯,這個(gè)5會(huì)被加到末尾,數(shù)值是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(),"輸入價(jià)格超出了最大價(jià)格");
return "";
}
return null;
}
};
這種方式,將用戶(hù)輸入的值插入到光標(biāo)位置,再進(jìn)行數(shù)值檢查。
測(cè)試了幾種情況,是滿(mǎn)足需求的。
然而,加了這個(gè)inputFilter以后,再設(shè)置maxLength,不管用了。
需要自己增加length的filter
this.setFilters(new InputFilter[]{moneyInputFilter, new InputFilter.LengthFilter(LENGTH)});