TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged.
TextWatcher通常与TextView结合使用,以便在文本变化的不同时机做响应的处理。TextWatcher中三个回调接口都是使用了InputFilter过滤器过滤之后的文字字符作为新的字符对象。
使用方法
mTextView.addTextChangedListener(new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) { //屏蔽回车 中英文空格
@Override
public void afterTextChanged(Editable s) { //屏蔽回车 中英文空格
}
});
我们可以在beforeTextChanged,onTextChanged,afterTextChanged的回调方法中实现自己的业务逻辑,这三个参数代表了TextView文本发生变化的三个阶段。
beforeTextChanged(CharSequence s, int start, int count, int after)方法是TextView在文本改变之前调用,并且传入四个参数。
CharSequence s参数表示当前TextView内部的mText成员变量,实际上就是当前显示的文本;
int start参数表示需要改变的文字区域的起点,即选中的文本区域的起始点;
int count参数表示需要改变的文字的字符数目,即选中的文本区域的字符的数目;
int after参数表示替换的文字的字符数目。
特别的,当TextView删除文本的时候,after的值为0,此时TextView使用用空字符串代替需要改变的文字区域来达到删除文字的目的。
图1.1描述了beforeTextChanged的四个参数的含义。
图1.1 beforeTextChanged的四个参数实例
TextView的setText方法通过调用sendBeforeTextChanged方法通知所有注册的TextWatcher回调beforeTextChanged方法,此时传入的四个参数,s是当前的本地变量mText的值,如果该值为null,即之前没有给TextView设置过需要显示的文本,那么s的值为"";start的值为0;count的值为当前mText的长度;after的值为需要显示的新文本的长度。代码1.1是TextView中setText方法调用sendBeforeTextChanged的源码。
代码1.1 TextView中setText方法调用sendBeforeTextChanged的源码
if (
mText !=
null) {
oldlen = mText.length() ;
sendBeforeTextChanged( mText , 0 , oldlen , text.length()) ;
} else {
sendBeforeTextChanged( "" , 0 , 0 , text.length()) ;
}
oldlen = mText.length() ;
sendBeforeTextChanged( mText , 0 , oldlen , text.length()) ;
} else {
sendBeforeTextChanged( "" , 0 , 0 , text.length()) ;
}
onTextChanged(CharSequence s, int start, int before, int count)方法是TextView在文本改变的时候调用,此时mText成员变量已经被修改为新的文本,并且传入四个参数。
CharSequence s参数表示当前TextView内部的mText成员变量,此时的mText已经被修改过了,但此时mText所表示的文本还没有被显示到UI组件上;
int start参数表示改变的文字区域的起点;
int before参数表示改变的文字区域在改变前的旧的文本长度,即选中文字区域的文本长度;
int after参数表示改变的文字区域在修改后的新的文本长度。
特别的,当TextView添加文本的时候,before 的值为0,此时相当于TextView将空的字符区域用新的文本代替。
afterTextChanged(Editable s)方法是TextView在调用完所有已注册的TextWatcher的onTextChanged方法之后回调的。此时mText成员变量已经被修改为新的文本,并且传入s,该参数s实际上就是mText。通过该接口,咱们可以再次修改将要展示的文字。
图1.2描述了这三个方法在TextView文字变化时的调用流程。
图1.2 TextView文字变化时的调用流程
afterTextChanged的参数类型是Editable,这是一个可编辑的对象,该对像就Text