当我在 TextWatcher 中使用此代码时,stackoverflow
出现错误:
txt.setText(s.toString().substring(0, s.length()-1) + "a");
为什么会发生这种情况,我该如何预防?我使用它onTextChanged
并且afterTextChanged
它们都生成stackoverflow
当我在 TextWatcher 中使用此代码时,stackoverflow
出现错误:
txt.setText(s.toString().substring(0, s.length()-1) + "a");
为什么会发生这种情况,我该如何预防?我使用它onTextChanged
并且afterTextChanged
它们都生成stackoverflow
此代码已损坏。在伪代码中,它读取
//whenever the text changes, replace the last letter with an 'a'
设置文本是文本更改,即使新文本与旧文本匹配,因此每次将“a”替换为另一个“a”时,您都会递归直到堆栈已满。
如果有终端案例,比如
if (!txt.endsWith("a"))
那么这不会溢出。
我使用的一个解决方案是暂时禁用导致递归的侦听器。
注意: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
...
}
当然,您会收到 StackOverFlow 错误。每次发生变化时,onTextChanged
都会调用回调。然后,在其中再次更改文本。
医生说:
调用此方法是为了通知您,在 s 中的某处,文本已更改。从此回调中对 s 进行进一步更改是合法的,但请注意不要让自己陷入无限循环
您需要一个条件来避免无限循环。例如:
if(s.charAt(s.length()-1)!='a')
s = s.append("a");