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,如需转载请自行联系原作者





相关文章
|
Android开发 数据安全/隐私保护
Android TextView 使用以及属性(方法)大全(下)
TextViewXML属性和相关方法说明(2)
1110 0
|
1月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
31 0
|
6月前
|
XML Java 开发工具
TextView
TextView
63 0
|
Java Android开发 iOS开发
Android TextView 与 EditText 的区别与使用
Android TextView 与 EditText 的区别与使用
160 0
|
Android开发
|
XML Java 开发工具
TextView(下)
TextView(下)
108 0
|
Android开发
Android控件之TextView
在android中,文本控件主要包括TextView控件和EditView控件
107 0
Android控件之TextView
|
XML Android开发 数据格式
Android TextView 使用以及属性(方法)大全(上)
TextView是什么 使用TextView 1.在xml中创建并设置属性 2.在xml中创建,在代码中设置属性 效果图: 布局文件 : 在代码中实现: 运行结果分析 3.在代码中创建并设置属性
418 0
Android TextView 使用以及属性(方法)大全(上)
|
存储 XML 自然语言处理
Android TextView 使用以及属性(方法)大全(中)
TextViewXML属性和相关方法说明(1)
1088 0
|
XML 编解码 Java
Android TextView属性设置大全
TextView文字底部或者中间加横线;TextView内容单行或者多行显示;TextView内容过长加省略号,点击显示全部内容;文字展开和收缩;同一TextView设置背景色圆角;同一TextView设置不同字体大小;工具类:分辨率dp和px相互转换;代码添加控件并设置Padding
785 0