关于EditText中的TextWatcher监听

功能:
1.监听EditText里输入内容的变化;
2.根据实时输入的文字内容,做出输入自动提示效果


接口方法:
TextWatcher myWatcher = newTextWatcher(){

@Override
public 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);
}

@Override
public 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);
}

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值