1

当我在 TextWatcher 中使用此代码时,stackoverflow出现错误:

 txt.setText(s.toString().substring(0, s.length()-1) + "a"); 

为什么会发生这种情况,我该如何预防?我使用它onTextChanged并且afterTextChanged它们都生成stackoverflow

4

3 回答 3

4

此代码已损坏。在伪代码中,它读取

//whenever the text changes, replace the last letter with an 'a'

设置文本是文本更改,即使新文本与旧文本匹配,因此每次将“a”替换为另一个“a”时,您都会递归直到堆栈已满。

如果有终端案例,比如

if (!txt.endsWith("a"))

那么这不会溢出。

于 2013-03-27T13:38:06.607 回答
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


   ...
  }
于 2013-09-28T02:44:26.733 回答
2

当然,您会收到 StackOverFlow 错误。每次发生变化时,onTextChanged都会调用回调。然后,在其中再次更改文本。

医生说:

调用此方法是为了通知您,在 s 中的某处,文本已更改。从此回调中对 s 进行进一步更改是合法的,但请注意不要让自己陷入无限循环

您需要一个条件来避免无限循环。例如:

if(s.charAt(s.length()-1)!='a')
  s = s.append("a");
于 2013-03-27T13:32:44.227 回答