一 ,事情起因
刚出现问题时候也是一脸的懵!?
用假数据搭建页面时没有任何问题的 , 随着数据的接入刷新等操作的完善这个简单的TextView的方法addTextChangedListener它(抽疯了)!
项目需求要输入寄存储(上传至服务端) , 然而我们错就错在轻看了它(不了解+不细心所致)
关于TextWatcher那几个方法的解释
TextWatcher的几个方法,分别监测了文本"改变前"、"改变时"、"改变中"三种状态。
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//这个方法被调用,说明在s字符串中,从start位置开始的count个字符即将被长度为after的新文本所取代。
// 在这个方法里面改变s,会报错。
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//这个方法被调用,说明在s字符串中,从start位置开始的count个字符刚刚取代了长度为 before的旧文本。
// 在这个方法里面改变s,会报错。
}
@Override
public void afterTextChanged(Editable s) {
//这个方法被调用,那么说明s字符串的某个地方已经被改变。
}
});
二,寻找问题并解决
问题出现了,带着一脸懵去改.通过现象(当EditText有内容变化时,光标迁移到起始位置,并阻止输入).
通过log日志发现无限循环调用.那么问题找到了 , 因为TextWatcher afterTextChanged无限迭代导致的异常!
网上提供了各种解决方法:
- 为EditText 设置inputType="textNoSuggestions"
- 通过tag方法在阻止重复
- 通过调整设置addTextChangedListener(new TextWatcher());的时机 , 获取焦点时设置 , 或者在
afterTextChanged(Editable s) 方法中有removeTextChangedListener()操作等
解决问题究其原因 , 为什么出现循环! 我是在afterTextChanged(Editable s) 进行部分逻辑的 . 那么afterTextChanged(Editable s) 和时被调用是关键 !
addTextChangedListener()是TextView的方法 , EditText继承自TextView , 当然也有这个方法。
从官方的介绍可知 , 添加了TextWatcher后 , 每当TextView的文本改变时 , TextWatcher的那几个方法就会被调用.
另外一句,是关于在 afterTextChanged (Editable s)中setTest()的一些问题 , 也就是在监测"改变后"状态的方法又去改变那个文本 , 这样想想都容易出问题 .
那么问题就出在 , 原本改变之后的文本 , 有呗某处改变了 , 再次的调用了afterTextChanged (Editable s)循环往复!
如果以上的方法不能解决问题 , 那么耐心的寻找是否哪里对EditText有操作的代码~
网友评论