android edittext inputfilter,EditText之InputFilter的使用(一)
8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?引言在使用EditText的时候,我们常常需要根据需求限制用户输入的格式,字符。例如只能接收用户输入邮箱地址、电话号码、数字、密码等等。方案第一种方法是在xml布局文件中使用android:inputType属性,见图1。常用配置:text: 对于输入没有任何限制number: 只限于输入数字、符号以及小数点,同[0-9.
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
引言
在使用EditText的时候,我们常常需要根据需求限制用户输入的格式,字符。例如只能接收用户输入邮箱地址、电话号码、数字、密码等等。
方案
第一种方法是在xml布局文件中使用android:inputType属性,见图1。
常用配置:text: 对于输入没有任何限制
number: 只限于输入数字、符号以及小数点,同[0-9+-.]
numberDecimal: 只允许输入数字与小数点,同[0-9.]
numberSigned: 只允许输入数字与符号,同[0-9+-]
textPassword: 对于输入没有限制,但会以密码的形式显示
textCapWords: 对于输入没有限制,但会将每个单词的首字母自动转换为大写
使用此方法能满足大部分的需求,且相应配置都会弹出相对应的软键盘,界面显示效果也比较和谐统一。美中不足之处在于可定制性不高,如果需要限制的格式比较特殊,无法使用该方法完成我们的需求。作为一名有素养有追求的程序员,我们不会止步于满足大多数,因此继续深入。
改进
通常解决的方法是使用TextWatcher,重写以下方法。1
2
3
4
5
6
7
8public void (CharSequence charSequence, int start, int count, int after){}
public void onTextChanged(CharSequence charSequence, int start, int before, int count){}
public void afterTextChanged(Editable editable){}
在beforeTextChanged里记住输入前的值,在onTextChanged或者afterTextChanged里拿到修改过后的值,然后与我们的需求格式(正则表达式或者String.startWith等表达式)进行比较,如果符合条件就继续输入,否则将内容显示为输入前值,并将光标定位到相应位置。
用TextWatcher基本能实现我们的预期需求了。但是,从理论上来讲,我们不应该这么用。TextWatcher,顾名思义,它是用来监听用户的输入的。当用户输入指定字符后,UI如果需要作相应更新,就可以通过TextWatcher接收到通知。除此之外,TextWatcher不应该做过多超出自己本职的工作。那么,这部分工作由谁来完成呢??
完善
答案是InputFilter。从名字上就可以看出这是一个过滤器,负责过滤掉所有不合要求的操作。那么如何使用呢?首先看看这个类本身的结构。1
2
3
4
5public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend);
public static class AllCaps implements InputFilter{}
public static class LengthFilter implements InputFilter{}
有一个待实现的filter方法,以及两个实现了filter方法的内部类。
AllCaps
设置了AllCaps过滤器的EditText,会自动将用户输入的小写字母转换成大写字母,效果上与设置android:textAllCaps="true"相同。使用InputFilter时需调用EditText的setFilters(InputFilter[] filters)方法。一个EditText可以设置多个过滤器,因此传入的值为数组。使用AllCaps的代码示例,1EditText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
LengthFilter
添加该过滤器,效果上与android:maxLength=""相同。使用如下,1
2EditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
filter方法我们最后再来解析,接下来我们先了解一下InputFilter的子类。
DigitsKeyListener
更多推荐
所有评论(0)