理解EditText的InputFilter(二)
tText()方法中
[java]
int n = mFilters.length;
for (int i = 0; i < n; i++) {
CharSequence out = mFilters[i].filter(text, 0, text.length(), EMPTY_SPANNED, 0, 0);
if (out != null) {
text = out;
}
}
sendOnTextChanged(text, 0, oldlen, textLength);
onTextChanged(text, 0, oldlen, textLength);
遍历所有的InputFilter,如果filter后的结果不是null,更新text变量。这意味着filter返回null就代表保持原文本不变(如上,在InputFilter.LengthFilter中看到的)。所有InputFilter后的结果就是最终显示在TextView中的文本。
了解了InputFilter的原理,就知道如何对TextView/EditText的文本做“手脚”了。比如
不响应所有输入的特殊字符(@#$%^&)
显示最多只能输入100个大写字母(使用InputFilter.LengthFilter和InputFilter.Allcaps的组合)
将输入的某个字符自动替换为其他字符
回头再看看disable EditText的那个InputFilter,对EditText来说,调用filter()的后三个参数始终是EMPTY_SPANNED, 0, 0,当执行filter时,就相当于执行EMPTY_SPANNED.subSequence(0, 0),永远返回"",从而实现了disable。