Android TextWatchwer使用注意事项

2018-01-25  本文已影响0人  Lonelyyy

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,所以还是保持个好习惯,就像注册广播后要取消一样

上一篇下一篇

猜你喜欢

热点阅读