关于EditText中的TextWatcher监听

来源:互联网 发布:js判断上传文件的类型 编辑:程序博客网 时间:2024/05/01 00:38


转载地址:http://www.aichengxu.com/view/40127


关于EditText中的TextWatcher监听,有需要的朋友可以参考下。




功能:

1.监听EditText里输入内容的变化;

2.根据实时输入的文字内容,做出输入自动提示效果







接口方法:

TextWatcher myWatcher = newTextWatcher(){@Overridepublic void onTextChanged(CharSequence s,int start,int before,int count){     System.out.println("onTextChanged");     System.out.println("s = "+s+",start = "+start+",before = "+before+",count = "+count);}@Overridepublic void beforeTextChanged(CharSequence s,int start,int count,int after){     System.out.println("beforeTextChanged");     System.out.println("s = "+s+",start = "+start+",count = "+count+",after = "+after);}@Overridepublic void afterTextChanged(Editable s){     System.out.println("afterTextChanged");     System.out.println("s = " + s);}};








触发过程:






1.beforeTextChanged(CharSequence s,int start,int count,int after);

在EditText里的内容即将发生变化之前触发,EditText里的内容变化有3种方式:

1.新增加字符;2.删除字符;3.替换输入框中的若干个字符。

该方法反映的是,EditText在要发生变化之前,原来的内容字符串s有哪几个字符将要发生何种变化。

无论何种变化方式,都可以理解为:输入框的原内容字符串s,从索引位置start开始,

有count个字符即将被替换,替换这count个字符的新的字符个数为after

注意:s是变化之前的输入框内容

2.onTextChanged(CharSequence s,int start,int before,int count);

在EditText里的内容发生变化之时触发,

在变化时的新的字符串s里,从索引位置start开始,有count个字符,是替换了原来的before个字符的

注意:s是变化之后的输入框内容

3.afterTextChanged(Editable s)

text变化之后触发,s是最终新的输入框内容








测试实例:

1.先输入字符串“汉口”

beforeTextChanged

s = ,start = 0,count = 0,after = 2

onTextChanged

s = 汉口,start = 0,before = 0,count = 2

afterTextChanged

s = 汉口

2.再输入字符串“天门”

beforeTextChanged

s = 汉口,start = 2,count = 0,after = 2

onTextChanged

s = 汉口天门,start = 2,before = 0,count = 2

afterTextChanged

s = 汉口天门

3.删除字符“门”

beforeTextChanged

s = 汉口天门,start = 3,count = 1,after = 0

onTextChanged

s = 汉口天,start = 3,before = 1,count = 0

afterTextChanged

s = 汉口天

4.删除“汉口”

beforeTextChanged

s = 汉口天,start = 0,count = 2,after = 0

onTextChanged

s = 天,start = 0,before = 2,count = 0

afterTextChanged

s = 天

5.用“浙江”替换“天”

beforeTextChanged

s = 天,start = 0,count = 1,after = 2

onTextChanged

s = 浙江,start = 0,before = 1,count = 2

afterTextChanged

s = 浙江




总结:



1.判断EditText里的内容是否被删除

如果beforeTextChanged里的after为0,则表示正在删除字符


2.在afterTextChanged()方法里执行后续的监听响应操作

3.实现类似网页输入框中的自动提示功能

每次afterTextChanged()执行之后,延迟300ms发送一个pending message去联网查询相关提示信息,

并且在每次发送查询pending message之前,先remove掉原来的pending message。

如果用户快速删除输入框里的内容,到最后输入框里为空,要记得remove掉之前的pending 
message,

如果前面的某次pending message已经执行,则要记得清空查询出来的自动提示信息。

用户可能输入很快,延时发送查询消息,能尽可能减少联网查询的次数,提高查询效率。

4.联想到CursorAdapter和ListView绑定时,当数据库内容发生变化,ListView马上刷新,

如果数据库变化及其频繁,会导致频繁的刷新UI,可以考虑延时300ms左右发送一个消息,

将若干次数据的变化,只用一次刷新UI,提高性能。

0 0
原创粉丝点击