1

TextWatcher内でこのコードを使用すると、stackoverflowエラーが発生します。

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

なぜこれが発生し、どうすればそれを防ぐことができますか?私はそれを使用しonTextChangedafterTextChangedそれらの両方がスタックオーバーフローを生成します

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 に答える