2013-08-20 11 views
6

Sto provando ad applicare un colore di carattere al testo in un EditText durante la digitazione del testo. Tuttavia, è solo molto incoerente, il che significa che a volte se si digita uno spazio, il testo che precede lo spazio tornerà al colore nero predefinito. O se metto il cursore nel mezzo di una parola e inizio a digitare l'intera parola cambia colore e non solo il testo che sto digitando. Il grassetto, il corsivo e la sottolineatura sembrano funzionare bene però. Come posso garantire che solo il testo che sto digitando sarà interessato dal colore del carattere?Android EditText: come applicare l'intervallo cromatico in primo piano durante la digitazione?

"TAGLIA E COLORE" commento

vedi sotto ...

 contentEdit.addTextChangedListener(new TextWatcher() { 
      public void afterTextChanged(Editable s) { 

       //add style as the user types if a toggle button is enabled 
       ToggleButton boldButton = (ToggleButton) findViewById(R.id.bold); 
       ToggleButton emButton = (ToggleButton) findViewById(R.id.italic); 
       ToggleButton underlineButton = (ToggleButton) findViewById(R.id.underline); 

       int position = Selection.getSelectionStart(contentEdit.getText()); 

       try{ 
        if (position < 0){ 
         position = 0; 
        } 

        if (position > 0){ 

         if (styleStart > position || position > (cursorLoc + 1)){ 
          //user changed cursor location, reset 
          if (position - cursorLoc > 1){ 
           //user pasted text 
           styleStart = cursorLoc; 
          } 
          else{ 
           styleStart = position - 1; 
          } 
         } 

         if (boldButton.isChecked()){ 
          StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           if (ss[i].getStyle() == android.graphics.Typeface.BOLD){ 
            s.removeSpan(ss[i]); 
           } 
          } 
          s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 
         if (emButton.isChecked()){ 
          StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           if (ss[i].getStyle() == android.graphics.Typeface.ITALIC){ 
            s.removeSpan(ss[i]); 
           } 
          } 
          s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 
         if (underlineButton.isChecked()){ 
          UnderlineSpan[] ss = s.getSpans(styleStart, position, UnderlineSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           s.removeSpan(ss[i]); 
          } 
          s.setSpan(new UnderlineSpan(), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 

         //SIZE AND COLOR////////////////////////////////////////////////////// 
         s.setSpan(new ForegroundColorSpan(m_color), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
         s.setSpan(new AbsoluteSizeSpan(m_curSize, true), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
} 
       } 
       catch(Exception e){ 
        //Toast.makeText(m_ctx, m_ctx.gets, Toast.LENGTH_LONG).show(); 
        showMessage(R.string.NOTE_WARNING_STYLE,m_utils.MSGTYPE_WARNING); 
       } 

       cursorLoc = Selection.getSelectionStart(contentEdit.getText()); 
      } 
+1

qualcuno ?? Questo è qualcosa a cui ho cercato una risposta per un po 'ora ... – Mike6679

+0

Quale versione di Android stai testando? La versione min e mirata? –

+0

2.2 è il minimo e mirato – Mike6679

risposta

1

ho cambiato l'inizio del Spannable position-position - 1:

//Color 
s.setSpan(new ForegroundColorSpan(m_color), 
      position-1, 
      position, 
      Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
//Size 
s.setSpan(new AbsoluteSizeSpan(m_curSize, true), 
      position-1, 
      position, 
      Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
+0

FYI: cambiando "start of the Spannable da position to position - 1" ha permesso di colorare il testo mentre scrivevo, ma questo stile durante la digitazione è ancora molto inconsistente e buggato. Ho finito per applicare solo gli stili al testo evidenziato dall'utente che funziona in modo molto coerente. – Mike6679

1

in questo modo ....

public static SpannableString parseActiveReply(String name, String body) { 
    SpannableString sp = new SpannableString(name + " " + body); 
    // 设置用户名字体加粗、高亮 
    sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0, 
      name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    // sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0, 
    // 0, 
    // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    return sp; 
} 
+0

Cosa rappresentano il nome e i parametri del corpo? – Mike6679

5

È possibile utilizzare il modello per trovare le parole e quindi applicare qualsiasi intervallo alle parole.

@Override 
public void afterTextChanged(Editable s) { 
    Spannable textSpan = s; 
    final Pattern pattern = Pattern.compile("\\w+"); 
    final Matcher matcher = pattern.matcher(textSpan); 
    while (matcher.find()) { 
     start = matcher.start(); 
     end = matcher.end(); 
     textSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

    } 

Questo è tutto. evidenzierà tutte le parole corrispondenti digitate. Spero che aiuti.

+0

Funziona al 100% !!! Molte grazie !!!!!!!!!!! – Guihgo

Problemi correlati