TextWatcher的使用想必很多人都不陌生,用来监听edittext的内容变化是非常方便的继承TextWatcher接口并重写方法即可
public interface TextWatcher extends NoCopySpan {
public void beforeTextChanged(CharSequence s, int start, int count, int after);
public void onTextChanged(CharSequence s, int start, int before, int count);
public void afterTextChanged(Editable s);
}
1.使用举例
editText.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) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
2.注意事项
建议重写的TextWatcher不要使用匿名内部类,并且使用完之后记得remove,像这样
TextWatcher watcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
editText.addTextChangedListener(watcher);
...
editText.removeTextChangedListener(watcher);
这样做的原因是可以避免TextWatcher中的接口被多次回调,可以看一看TextView源码的实现
private ArrayList<TextWatcher> mListeners;
public void addTextChangedListener(TextWatcher watcher) {
if (mListeners == null) {
mListeners = new ArrayList<TextWatcher>();
}
mListeners.add(watcher);
}
可以看到,TextView中用mListeners来保存传入的TextWatcher,当出现内容变化时再调用每个TextWatcher的内部方法,
然而,mListeners是一个ArrayList,ArrayList内部是允许重复元素的,所以,当一个textview的addTextChangedListener被执行多次的时候,其内部的方法也会被重复调用多次,就可能会带来一些bug,所以还是保持个好习惯,就像注册广播后要取消一样
网友评论