android TextWatcher中的stackoverflow

时间:2013-03-27 13:30:43

标签: java android textwatcher

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

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

为什么会发生这种情况以及如何防止这种情况发生? 我在onTextChangedafterTextChanged上使用它,并且它们都生成stackoverflow

3 个答案:

答案 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");