2015-08-29 2 views
0

УЖЕ знаю, что есть много вопросов, задающих одно и то же, но они не работают для меня. Вот код (я использую код, чтобы окрасить часть текста в EditText) -Ошибка Android TextWatcher StackOverflow

et_note.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 
      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       if (textCC.contains("sample_text")) { 
      String syntaxText = "sample_text"; 
      int ofe = textCC.indexOf(syntaxText, 0); 
      int nextOfe = textCC.indexOf(syntaxText, ofe); 
      for (int ofs = 0; ofs < textCC.length() && ofe != -1 && nextOfe != -1; ofs = nextOfe + 1) { 
       ofe = textCC.indexOf(syntaxText, ofs); 
       nextOfe = textCC.indexOf(syntaxText, ofe + 1); 
       if (ofe == -1 || nextOfe == -1) { 
        break; 
       } else { 
        Spannable WordtoSpan = new SpannableString(et_note.getText()); 
        WordtoSpan.setSpan(new ForegroundColorSpan(0xFF00FF00), ofe, nextOfe + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        et_note.setText(WordtoSpan, TextView.BufferType.SPANNABLE); 
       } 
      } 
     } 
      } 
      @Override 
      public void afterTextChanged(Editable editable) { 
      } 
     }); 

Это дает ошибку переполнения стека.

Ответы, которые работают, но не подходят -

1) Добавить et_note.removeTextChangedListener(this) перед кодом и добавить et_note.addTextChangedListener(this) после кода - Это один работает, но НЕ правильно, и приложение становится очень медленным.

Любые другие способы, которые помогут мне? Благодарю.

+2

Для одного, не называют 'SetText()' на 'наблюдаемого EditText'. Вместо создания нового 'Spannable', основанного на том, что находится в' EditText', просто используйте 'Spannable', который вы вернетесь из' getText() ', и установите для него свой диапазон. – CommonsWare

+0

@CommonsWare Как мне это сделать? Я имею в виду _use Spannable, что вы возвращаетесь из getText(), и устанавливаете свой диапазон на нем. – FadedCoder

+1

'et_note' выглядит как' EditText'. [Метод 'getText()' в 'EditText' возвращает' Editable'] (http://developer.android.com/reference/android/widget/EditText.html#getText%28%29). ['Editable' является под-интерфейсом' Spannable'] (http://developer.android.com/reference/android/text/Editable.html). ['setSpan()' - это метод, определенный в 'Spannable'] (http://developer.android.com/reference/android/text/Spannable.html#setSpan%28java.lang.Object,%20int,%20int, % 20int% 29). Следовательно, вы можете вызвать 'setSpan()' для объекта, возвращаемого 'et_note.getText()'. – CommonsWare

ответ

0

Спасибо CommonsWare, я нашел ответ. Просто опубликуйте этот ответ, чтобы помочь другим. Это решило мою проблему -
Вместо этого,

Spannable WordtoSpan = new SpannableString(et_note.getText()); 
       WordtoSpan.setSpan(new ForegroundColorSpan(0xFF00FF00), ofe, nextOfe + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       et_note.setText(WordtoSpan, TextView.BufferType.SPANNABLE); 

Я использовал это -

et_note.getText().setSpan(new ForegroundColorSpan(0xFF00FF00), ofe, nextOfe + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
Смежные вопросы