当我在TextWatcher中使用此代码时,我得到stackoverflow
错误:
txt.setText(s.toString().substring(0, s.length()-1) + "a");
为什么会发生这种情况以及如何防止这种情况发生?
我在onTextChanged
和afterTextChanged
上使用它,并且它们都生成stackoverflow
答案 0 :(得分:4)
我使用的解决方案是暂时禁用导致递归的侦听器。
注意:RichEditText是EditText的子类。 例如
@Override
public void afterTextChanged(Editable s)
{
...
RichEditText.this.removeTextChangedListener(this); //disable listener
//Change s here. Changes made to s will not cause recursion since the listener is disabled
RichEditText.this.addTextChangedListener(this); //reenable listener
...
}
答案 1 :(得分:3)
此代码已损坏。在伪代码中,它读取
//whenever the text changes, replace the last letter with an 'a'
设置文本是一个文本更改,即使新文本与旧文本匹配,因此每次'a'替换为另一个'a'时,您将递归直到堆栈已满。
如果有终端案例,例如
if (!txt.endsWith("a"))
然后这不会溢出。
答案 2 :(得分:2)
当然,您会收到StackOverFlow错误。每当某些内容发生变化时,都会调用回调onTextChanged
。然后,在里面再次更改文本。
调用此方法是为了通知您s中的某个文本 已经变了。对s进行进一步更改是合法的 这个回调,但要注意不要让自己陷入无限 环
你需要一个条件来避免infinte循环。例如:
if(s.charAt(s.length()-1)!='a')
s = s.append("a");