2011-08-28 19 views
67

Estoy buscando una forma de cambiar el color de un texto de una sola palabra en un TextView dentro de un Activity.Cambiar el color del texto de una palabra en un TextView

Por ejemplo, con esta:

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

¿Cómo puedo cambiar el color del texto next a rojo?

+1

Posible duplicado de [? ¿Es posible tener varios estilos dentro de una Vista de Texto] (http://stackoverflow.com/questions/1529068/is-it- possible-to-have-multiple-styles-inside-a-textview) – blahdiblah

+0

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

Respuesta

130

La manera más fácil que conozco es utilizar html.

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

Pero esto será necesario que para reconstruir el TextView cuando (si?) Que desea cambiar el color, lo que podría causar una molestia.

+1

This es definitivamente la manera más simple pero no debería ser el color = '# EE0000' el símbolo de libra es necesario para denotar un color hexadecimal. – Tom

+0

Solucionado, gracias! No recuerdo si copié esto del código actual o de memoria con un sitio web de generador de color por lo que podría no haber funcionado antes. – Dan

+0

Ok solo asegúrate! Además, como descubrí, no puedes usar códigos hexadecimales de 8 dígitos por lo que no hay componente alfa. Ese me dejó perplejo por 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); 

tienes que usar un elemento que también te permite aumentar el tamaño del texto, ponerlo en negrita, etc ... incluso poner una imagen.

+4

Buena respuesta, gracias. En este caso, "s.length()" se puede usar en lugar de "start + next.length()": int end = s.length(); – Oleg

+1

En caso de que alguien busque Xamarin.Android Solution. Puede asignar el objeto 'SpannableString' utilizando la propiedad' TextFormatted' de su control. – CodeIt

+0

No se pudo hacer funcionar esto.Terminó yendo con la solución de B K. –

2

Si desea cambiar el estado de todas las instancias de una determinada String dentro de un TextView texto (mayúsculas y minúsculas) que puede utilizar StringBuilder s y SpannableString como esto:

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

}

  • Almacenar todo el texto TextView dentro de StringBuilder.
  • Almacene la cadena buscada dentro de StringBuilder.
  • tienda del wholre TextView texto dentro de un SpannableString
  • Haz una operación sencilla para encontrar todas las instancias String dentro del texto TextView y cambiarlos cuando llegó.
  • Establezca el valor de texto de TextView en SpannableString.
15

Uso SpannableStringBuilder así:

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

¿Hay algo que pueda reemplazar 'nuevo ForegroundColorSpan (Color)' con para hacer que el texto conserve su color predeterminado original? – cjnash

Cuestiones relacionadas