关于EditText中的TextWatcher监听

来源:互联网 发布:为mysql设置密码 编辑:程序博客网 时间:2024/05/22 10:36


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

功能:
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