2015-08-29 1 views
0

Je sais déjà qu'il y a beaucoup de questions qui demandent la même chose, mais elles ne fonctionnent pas pour moi. Voici le code (j'utilise le code pour colorer une partie de texte dans un EditText) -Android TextWatcher Erreur 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) { 
      } 
     }); 

Il donne une erreur de débordement de pile.

Les réponses qui fonctionnent mais ne conviennent pas -

1) Ajouter et_note.removeTextChangedListener(this) avant le code et ajouter et_note.addTextChangedListener(this) après le code - Celui-ci fonctionne, mais pas correctement et l'application devient très lent.

D'autres moyens qui m'aideront? Merci.

+2

D'une part, ne pas appeler 'setText()' 'sur le EditText' regardé. Au lieu de créer un nouveau 'Spannable' basé sur ce qui est dans le' EditText', utilisez juste le 'Spannable' que vous revenez de' getText() ', et définissez votre span dessus. – CommonsWare

+0

@CommonsWare Comment faire? Je veux dire que j'utilise le Spannable que vous obtenez de getText(), et définissez votre span sur it_. – FadedCoder

+1

'et_note' semble être un' EditText'. [La méthode 'getText()' sur 'EditText' renvoie un fichier' Editable'] (http://developer.android.com/reference/android/widget/EditText.html#getText%28%29). ['Editable' est une sous-interface de' Spannable'] (http://developer.android.com/reference/android/text/Editable.html). ['setSpan()' est une méthode définie sur 'Spannable'] (http://developer.android.com/reference/android/text/Spannable.html#setSpan%28java.lang.Object,%20int,%20int, % 20int% 29). Par conséquent, vous pouvez appeler 'setSpan()' sur l'objet renvoyé par 'et_note.getText()'. – CommonsWare

Répondre

0

Grâce à CommonsWare, j'ai trouvé la réponse. Juste poster cette réponse pour aider les autres. Cela a résolu mon problème -
Au lieu de cela,

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); 

J'ai utilisé ce -

et_note.getText().setSpan(new ForegroundColorSpan(0xFF00FF00), ofe, nextOfe + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);