0

要从文本中删除空格,我编写了以下代码。我的要求是删除文本之间的空格,同时从相同的 EditText 复制粘贴文本(键入“文本”复制并将其粘贴到相同的 EditText 中。文本应该是“文本文本”,但实际上它就像“文本文本”一样)。但问题是当我将 textChangedListener 添加到我的Edittext时它崩溃了。

 textForm.addTextChangedListener(new TextWatcher() {

     @Override
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

         String str = textForm.getText().toString().replace(" ", ""); 
         textForm.setText(str);
     }

     @Override
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
        int arg3) {
        // TODO Auto-generated method stub

     }

     @Override
     public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub

    }
 });

logcat错误如下

04-24 14:55:12.660: E/AndroidRuntime(20780): java.lang.StackOverflowError
04-24 14:55:12.660: E/AndroidRuntime(20780):    at android.text.TextUtils.getChars(TextUtils.java:60)
4

2 回答 2

2

这是因为您在 onTextChanged 内执行 setText() 。因此,当您更改文本时,将调用 onTextChanged 并再次在 onTextChanged 内调用 setText()。所以 thr 文本再次更改,onTextChanged() 将再次被调用,此过程将继续直到堆栈溢出并导致 stackOverFlow 错误。希望你能明白...

setText() 之前的用户 removeTextChangedListener()。

检查这篇文章以获得完整的解决方案: https ://stackoverflow.com/a/8600921/912851

于 2012-04-24T09:33:22.027 回答
1

您已经设法创建了一个无限循环:)

您更改文本,这会导致调用 onTextChanged 侦听器,更改文本的位置会导致在更改文本的位置调用 onTextChanged 侦听器.....

尝试这个

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

     if (textForm.getText().toString().contains(" ")){
         String str = textForm.getText().toString().replace(" ", ""); 
         textForm.setText(str);
     }
}

或这个

@Override
public void afterTextChanged(Editable s) {
    String replacedText = s.toString().replaceAll(" ", "");
    if (!replacedText.equals(s.toString())) {
         textForm.setText(replacedText);   
    }
}

可能有更优雅的方法可以做到这一点,两次获取 textview 文本效率低下,但你明白了..

于 2012-04-24T09:36:51.057 回答