EditText在addTextChangedListener添加的TextWatcher中如果在afterTextChanged方法中又重新调用了setText, 那么会重复触发对此方法的递归死循环调用, 产生ANR, 官方文档有说明:

/** * This method is called to notify you that, somewhere within * </span>s</code>, the text has been changed. * It is legitimate to make further changes to </span>s</code> from * this callback, but be careful not to get yourself into an infinite * loop, because any changes you make will cause this method to be * called again recursively. * (You are not told where the change took place because other * afterTextChanged() methods may already have made other changes * and invalidated the offsets.  But if you need to know here, * you can use {@link Spannable#setSpan} in {@link #onTextChanged} * to mark your place and then look up from here where the span * ended up. */public void afterTextChanged(Editable s);

那么简单的解决办法之前就是调用setText之前暂时去掉此监听器, 然后再恢复添加自身即可.

xxxEdit.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) {

     

     xxxEdit.removeTextChangedListener(this);

     xxxEdit.setText(新取值”);

     xxxEdit.addTextChangedListener(this);

    }

});

转载请注明:WebLogic Android 博客 » TextWatcher如何避免在afterTextChanged中调用setText后导致死循环