TextView和EditText中的setFilters方法说明

简介:

在TextView中有一个方法public void setFilters(InputFilter[] filters),API中有一句说明:Sets the list of input filters that will be used if the buffer is Editable.  Has no effect otherwise。InputFilter的作用是对输入的文字进行过滤,可以自定义处理,这句话的意思是可以设置自定义处理对象列表,但是他们是否会起作用还要看TextView的文字缓冲区是否是Editable。

       所以,我们进到Editable的API页面,可以看到Editable类也有个方法public void setFilters(InputFilter[] filters),翻开TextView源码可以看到下面两段代码:

 

public void setFilters(InputFilter[] filters) {
if (filters == null) {
throw new IllegalArgumentException();
}
mFilters = filters;
if (mText instanceof Editable) {
setFilters((Editable) mText, filters);
}
}


private void setFilters(Editable e, InputFilter[] filters) {
if (mEditor != null && mEditor.mKeyListener instanceof InputFilter) {
InputFilter[] nf = new InputFilter[filters.length + 1];
System.arraycopy(filters, 0, nf, 0, filters.length);
nf[filters.length] = (InputFilter) mEditor.mKeyListener;
} else {
e.setFilters(filters);
}
}
        通过上面的代码可以看到,TextView的setFilters方法实际上是Editable对象setFilters方法的代理。在Editable类API中对setFilters方法的描述是这样的:Sets the series of filters that will be called in succession whenever the text of this Editable is changed, each of which has the opportunity to limit or transform the text that is being inserted。意思大概是说,这个方法为Editable对象设置了一组文字过滤器,当文字发生变化时,每一个过滤器都有机会发生作用。

 

        Android SDK中定义了一组InputFilter接口的实现,但是,大多数时间我们可以自己实现InputFilter接口,主要是实现CharSequence filter(CharSequence source,int start,int end,Spanned dest,int dstart,int dend)接口方法,这里六个参数的意义分别为:

 

source 新输入的字符串
start 新输入的字符串起始下标,一般为0
end 新输入的字符串终点下标,一般为source长度-1
dest 输入之前文本框内容
dstart 原内容起始坐标,一般为0
dend 原内容终点坐标,一般为dest长度-1

        我们可以在filter实现方法中对source进行判断处理,并返回一个CharSequence对象,追加到dest后面;

 

 

 

 一般需要限制一个EditText的最大输入字符数,就直接在布局文件里为标签添加maxLength属性就可以了,但是这种方法有的时候并不适用,比如你在代码中为空间又添加了一个InputFilter,这个filter的作用可能是对你输入的字符进行一些格式上的限制,那么这个filter就会使你在布局文件中定义的maxLength失效。这个时候就需要在代码中设置EditText的最大输入字符数。

1.获取控件:

et_vcode = (EditText)view_vcode.findViewById(R.id.EditText_VCode);


2.设置规则:

et_vcode.setFilters();参数是一个InputFilter类型的数组
如果直接添加限制字数的规则,直接newLengthFilter就可以了,例如限制输入最大不超过16位:
et_vcode.setFilters(new InputFilter[]{new InputFilter.LengthFilter(16)});

如果此时你还有另一个规则,例如只能输入a-z的小写字母,直接在InputFilter数组中添加就可以了。
et_vcode.setFilters(new InputFilter[]{codeInputFilter, new InputFilter.LengthFilter(16)});

codeInputFilter继承InputFilter,规则自己定义,重写里面的
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {}
这个方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功




    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6235943.html,如需转载请自行联系原作者





相关文章
|
21天前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
16 0
|
6月前
|
XML Java 开发工具
TextView
TextView
60 0
|
Java Android开发 iOS开发
Android TextView 与 EditText 的区别与使用
Android TextView 与 EditText 的区别与使用
154 0
|
XML Android开发 数据格式
Android EditText 获取/失去焦点
项目的需求中,又一个4位数的验证码界面,小弟才疏学浅,只想到了用线性布局里面放四个EditText。 需求需要输入内容后,自动跳到下一个位置聚焦,删除指定位置后,自动跳到上一个位置聚焦,由于聚焦/非聚焦UI展示得都不同,所以每个editText都会频繁的设置焦点变化。 之前因为是调用的系统键盘,所以,editText和键盘绑定后处理起来非常方便,但是,我们需要自定义一个展示在UI上的数字键盘,于是就有些bug。 bug不难,但是有点杂乱,下面是我的一点解决办法,总结一下,以后也记得更清楚!
|
Android开发
|
XML Java 开发工具
TextView(下)
TextView(下)
105 0
|
Android开发
Android控件之TextView
在android中,文本控件主要包括TextView控件和EditView控件
105 0
Android控件之TextView
|
Android开发
1-VIV-Android控件之TextView
零、前言 [1].今天总结一下TextView [2].TextView在View家族的地位是:源码行数11000+,可以说是个大类 [3].TextView直接继承自View,EditText,Button,CheckBox都是它的后代 [4].
1280 0