2011-08-28 13 views
67

Sto cercando un modo per cambiare il colore di un testo di una sola parola in una TextView all'interno di un Activity.Cambia il colore del testo di una parola in un TextView

Ad esempio, con questo:

String first = "This word is "; 
String next = "red" 
TextView t = (TextView) findViewById(R.id.textbox); 
t.setText(first + next); 

Come dovrei cambiare il colore del testo next al rosso?

+1

Eventuali duplicati di [? E 'possibile avere più stili all'interno di un TextView] (http://stackoverflow.com/questions/1529068/is-it- possibile-to-have-multiple-stili-dentro-a-TextView) – blahdiblah

+0

http://stackoverflow.com/questions/9754076/which-html-tags-are-supported-by-android-textview/35271588#35271588 –

risposta

130

modo più semplice che conosco è usare solo html.

String first = "This word is "; 
String next = "<font color='#EE0000'>red</font>"; 
t.setText(Html.fromHtml(first + next)); 

Ma questo richiederà di ricostruire il TextView quando (se?) Che si desidera cambiare il colore, che potrebbe causare una seccatura.

+1

Questo è sicuramente il modo più semplice, ma il colore non dovrebbe essere color = '# EE0000' è necessario il simbolo della sterlina per denotare un colore esadecimale. – Tom

+0

Risolto, grazie! Non ricordo se ho copiato questo codice reale o dalla memoria con un sito web di un generatore di colori, quindi potrebbe non aver funzionato prima. – Dan

+0

Ok, solo assicurandoti! Inoltre, come ho scoperto, non è possibile utilizzare codici esadecimali a 8 cifre, quindi nessun componente alfa. Quello mi ha bloccato per un momento. – Tom

62
t.setText(first + next, BufferType.SPANNABLE); 
Spannable s = (Spannable)t.getText(); 
int start = first.length(); 
int end = start + next.length(); 
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

è necessario utilizzare spannable questa volontà consente anche di aumentare le dimensioni un po 'di testo, renderlo grassetto, ecc .... anche mettere in qualche immagine.

+4

Buona risposta, grazie. In questo caso "s.length()" può essere usato al posto di "start + next.length()": int end = s.length(); – Oleg

+1

Nel caso in cui qualcuno cerchi Xamarin.Android Solution. Puoi assegnare l'oggetto 'SpannableString' usando la proprietà' TextFormatted' del tuo controllo. – CodeIt

+0

Impossibile farlo funzionare.Finito per andare con la soluzione di B K. –

2

Se si desidera modificare lo stato di tutte le istanze di una specifica String all'interno di un TextView di testo (case insensitive) è possibile utilizzare StringBuilder s e SpannableString come questo:

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString()); 
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString)); 
SpannableString spannableString = new SpannableString(myTextView.getText().toString()); 

int counter = 0; 
int index = 0; 

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++) 
{ 
    counter = 0; 
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index))) 
    { 
     counter++; 
     index++; 
     for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++) 
     { 
      if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index))) 
      { 
       counter++; 
       index++; 
      } 
      else 
      { 
       index++; 
       if (index % mySearchedString.length() == 0) 
       { 
        index = 0; 
       } 
       break; 
      } 
     } 
     if (counter == mySearchedString.length() - 1) // A match 
     { 
      spannableString.setSpan(new ForegroundColorSpan(Color.RED), i, 
           i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red) 
      index = 0; 
      continue; 
     } 
     else 
     { 
      index = 0; 
      continue; 
     } 
    } 
} 
myTextView.setText(spannableString); 

}

  • Memorizza l'intero testo TextView all'interno di StringBuilder.
  • memorizzare la stringa cercata all'interno di un StringBuilder.
  • Conservare il wholre TextView testo all'interno di una SpannableString
  • fare una semplice operazione per trovare tutti i String istanze all'interno del testo TextView e li cambia quando raggiunto.
  • Impostare il valore di testo della TextView al SpannableString.
15

Usa SpannableStringBuilder come questo:

SpannableStringBuilder builder = new SpannableStringBuilder(); 

SpannableString str1= new SpannableString("Text1"); 
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0); 
builder.append(str1); 

SpannableString str2= new SpannableString(appMode.toString()); 
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0); 
builder.append(str2); 

TextView tv = (TextView) view.findViewById(android.R.id.text1); 
tv.setText(builder, TextView.BufferType.SPANNABLE); 
+0

C'è qualcosa che posso sostituire con 'new ForegroundColorSpan (Color)' con per fare in modo che il testo mantenga il suo colore predefinito originale? – cjnash

Problemi correlati