原因
maxLength作為一個(gè)屬性遂庄,也是用inputFilter實(shí)現(xiàn)的。如果自定義了inputFilter劲赠,就會(huì)覆蓋掉原本maxLength的這個(gè)inputFilter涛目,所以無效。
探究
EditText控件里沒有maxLength這個(gè)屬性
EditText繼承TextView
TextView里有maxLength這個(gè)屬性
設(shè)置maxLength的代碼
if (maxlength >= 0) {
setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });
} else {
setFilters(NO_FILTERS);
}
看看LengthFilter的代碼
public static class LengthFilter implements InputFilter {
private final int mMax凛澎;`
public LengthFilter(int max) {
mMax = max;
}
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
int keep = mMax - (dest.length() - (dend - dstart));
if (keep <= 0) {
return "";
} else if (keep >= end - start) {
return null; // keep original
} else {
keep += start;
if (Character.isHighSurrogate(source.charAt(keep - 1))) {
--keep;
if (keep == start) {
return "";
}
}
return source.subSequence(start, keep);
}
}
/**
* @return the maximum length enforced by this input filter
*/
public int getMax() {
return mMax;
}
}
int keep = mMax - (dest.length() - (dend - dstart));
這一行是計(jì)算還留有多少字符可以輸入的
邏輯不復(fù)雜
**不過dend-dstart 我不明白霹肝,這兩個(gè)值我測試在大部分情況下是一樣的,刪除字符情況下预厌,dend-dstart = 1; **