在Android中更改文本更改文本会导致溢出错误

我想创build一个应用程序,它可以实时转换用户在EditText小部件中input的文本,并且我添加了一个TextWatcher来允许我对文本进行更改,但是这导致了溢出错误,因为我基本上正在创build一个无尽的循环( onTextChange -> code to change text -> onTextChange -> etc... )。

任何人都知道如何解决这个问题?

这是一个例子

 private boolean isEditable = true; private EditText text; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (EditText) findViewById(R.id.editText1); text.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (isEditable) { isEditable = false; styleText(s.toString()); } else { isEditable = true; } } }); } private void styleText(String completeText) { text.setText(completeText + " test"); } 

虽然上面的似乎是工作,我不能让它与Html.fromHtml(); ,这是我打算使用的。

再次编辑

 public class Main extends Activity implements TextWatcher { private EditText text; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (EditText) findViewById(R.id.editText1); text.addTextChangedListener(this); } @Override public void afterTextChanged(Editable s) { text.removeTextChangedListener(this); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { text.addTextChangedListener(this); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { text.removeTextChangedListener(this); text.setText("Test!"); } } 

它在第37行抛出一个StackOverflowException ,它是“ text.setText("Test!");

Solutions Collecting From Web of "在Android中更改文本更改文本会导致溢出错误"

编辑:和作品,不会引发exception:

  txtwt = new TextWatcher(){ @Override public void afterTextChanged(Editable s) { Log.i("REACHES AFTER", "YES"); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.i("REACHES BEFORE", "YES"); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { text.removeTextChangedListener(txtwt);//after this line you do the editing code text.setText("TEST"); Log.i("REACHES ON", "YES"); text.addTextChangedListener(txtwt); // you register again for listener callbacks }}; text = (EditText) findViewById(R.id.editText1); text.addTextChangedListener(txtwt); 

这是Logcat的证据,当我急剧推键:

 08-28 19:53:21.265: INFO/REACHES BEFORE(492): YES 08-28 19:53:21.276: INFO/REACHES ON(492): YES 08-28 19:53:21.276: INFO/REACHES AFTER(492): YES 08-28 19:53:21.296: INFO/REACHES BEFORE(492): YES 08-28 19:53:21.305: INFO/REACHES ON(492): YES 08-28 19:53:21.305: INFO/REACHES AFTER(492): YES 08-28 19:53:21.745: INFO/REACHES BEFORE(492): YES 08-28 19:53:21.755: INFO/REACHES ON(492): YES 08-28 19:53:21.755: INFO/REACHES AFTER(492): YES 08-28 19:53:21.775: INFO/REACHES BEFORE(492): YES 08-28 19:53:21.785: INFO/REACHES ON(492): YES 08-28 19:53:21.785: INFO/REACHES AFTER(492): YES 08-28 19:53:22.698: INFO/REACHES BEFORE(492): YES 08-28 19:53:22.705: INFO/REACHES ON(492): YES 08-28 19:53:22.705: INFO/REACHES AFTER(492): YES 08-28 19:53:23.855: INFO/REACHES BEFORE(492): YES 08-28 19:53:23.865: INFO/REACHES ON(492): YES 08-28 19:53:23.865: INFO/REACHES AFTER(492): YES 08-28 19:53:24.385: INFO/REACHES BEFORE(492): YES 08-28 19:53:24.395: INFO/REACHES ON(492): YES 08-28 19:53:24.395: INFO/REACHES AFTER(492): YES 08-28 19:53:24.485: INFO/REACHES BEFORE(492): YES 08-28 19:53:24.485: INFO/REACHES ON(492): YES 08-28 19:53:24.485: INFO/REACHES AFTER(492): YES 08-28 19:53:24.515: INFO/REACHES BEFORE(492): YES 08-28 19:53:24.525: INFO/REACHES ON(492): YES 08-28 19:53:24.525: INFO/REACHES AFTER(492): YES 08-28 19:53:24.625: INFO/REACHES BEFORE(492): YES 08-28 19:53:24.635: INFO/REACHES ON(492): YES 08-28 19:53:24.635: INFO/REACHES AFTER(492): YES 08-28 19:53:24.654: INFO/REACHES BEFORE(492): YES 08-28 19:53:24.665: INFO/REACHES ON(492): YES 08-28 19:53:24.665: INFO/REACHES AFTER(492): YES 
 private String originalValue; void onTextChanged(CharSequence text, int start, int before, int after) { if (text.toString().equals(originalValue)) { // do nothing } else { //change your text originalValue = text.toString(); } } 

编辑:

 public void onTextChanged(CharSequence s, int start, int before, int count) { String currentText = s.toString(); if (currentText.equals(originalValue)) { //the originalValue must be defined outside of the Watcher originalValue = styleText(currentText); // text.setText(originalValue); //if styleText doesn't do this } else { return; } }