写这篇文章完全是因为同事下午实现的一个功能,功能描述如下:
输入框内容如果为空,则不能输入0开始,否则是可以正常输入0,删除0之前的内容之后,0是可以正常展示的。
同事使用TextWatcher
实现,貌似后面实现了这个功能,但是看了下代码很复杂。之前在阅读TextView
源码的时候,看到一个长度过滤LengthInputFilter
,于是乎就想到了用InputFilter
实现岂不是非常简单。所以就有了下面的两行代码了。
inputSearch.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
if (TextUtils.isEmpty(inputSearch.text.toString()) && source == "0") {
""
}else{
null
}
})
InputFilter
整体上实现非常简单,它只有一个方法public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend);
下面对它的参数做一下说明:
source :变化的字符串
start :变化字符的首字符下标
end :变化字符的尾字符下
dest :带光标的字符串
dstart :光标的起始位置
dend :光标的结束位置
filter方法返回的是一个CharSequence,用来控制可编辑控件添加字符时的约束条件。
主要分为三种情况:
- 返回null,表示可正常添加source字符串;
- 返回"",表示不变动原字符;
- 返回以上之外的字符串,表示将返回的该字符串追加到远字符串中。