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代表匹配成功
TextView和EditText中的setFilters方法说明的更多相关文章
- TextView和EditText中添加图片(ImageSpan)
编辑框中加图片,以前一直以为很复杂,后来发现android有些类已经很好的实现了这些功能. 代码如下: [java] view plaincopy mSubjectDetailView = (Text ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...
- Android 在界面中显示以及输入文本信息 TextView和EditText
Android控件之TextView和EditTextTextView:显示文本框控件EditText:输入文本框TextView和EditText的常用属性TextView控件的常用属性androi ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- Android EditText中插入话题模块的删除处理方法
在 EditText 中添加话题 或者是 @某人 时 看起来挺简单,实际操作会有很多坑爹的问题 private String mTopic: //光标保持在话题的末尾 mInputEdit.setOn ...
- EditText中禁止输入中文的方法
应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...
- EditText中输入信息的限制的方法
应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...
- EditText中imeOptions属性使用及设置无效解决
虽然通常输入法软键盘右下角会是回车按键 但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标 点击浏览器网址栏的时候,输入法软键盘右下角会变成“GO”或“前往” 而我们点击Google搜 ...
- 隐藏android中EditText中的下划线以及修改光标颜色
在android开发中 EditTextText是我们经常用到的,我们使用时会有一些小问题,当我们点击输入文字时,EditText中的光标和下划线会变成粉红色. 解决方法很简单,我们只要在EditTe ...
随机推荐
- Android项目编译和使用C语言动态库(so库)
编译SO库 1.新建工程,建立jni目录用于放置c语言相关文件 2.编写Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) ...
- Android自定义控件1
概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会 ...
- clang -rewrite-objc的使用点滴
➠更多技术干货请戳:听云博客 clang -rewrite-objc的作用是把oc代码转写成c/c++代码,我们常用它来窥探OC的一些秘密. 1.最简单的例子 main.m的代码如下: int mai ...
- Android 数据库SQLite 写入SD卡
如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...
- Android 自定义控件(一)
本文用一个简单的例子来说明一下自定义控件的步骤实现,自定义控件有几种实现类型,分别为继承自view完全自定义,继承现有的 控件实现特定效果,继承viewgroup实现布局类等: 本文研究的是继承自vi ...
- 在SQL2008中使用XML应对不确定结构的参数
目的:统一接口,当数据结构发生变化时,前后端业务接口不发生变化,由业务具体解析结构. 规则:确定的接口用参数表(多行提交),不确定的参数用XML DECLARE @r TABLE ( ...
- 理解TCP三次握手/四次断开的必要性
1 TCP的三次握手与必要性 (1)三次握手图 (2)必要性:TCP通过三次握手建立可靠的(确保收到)的全双工通信. 1)第一次握手和第二次握手(ACK部分)建立了从客户端到服务器传送数据的可靠连接: ...
- ThreadLocal源码分析
1.概述 ThreadLocal,可以理解为线程的局部变量,作用就是为每一个使用该变量的线程都提供一个变量值的副本,每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. ThreadLo ...
- MYSQL的JOB
要让JOB顺利运行,必须要打开MYSQL的定时器. -- 查看是否开启定时器 SHOW VARIABLES LIKE '%sche%'; -- 开启定时器 0:off 1:on -- 这个需要最高权限 ...
- Using Confluent’s JDBC Connector without installing the entire platform
转自:https://prefrontaldump.wordpress.com/2016/05/02/using-confluents-jdbc-connector-without-installin ...