2011-08-28 9 views
67

Je cherche un moyen de changer la couleur d'un texte d'un seul mot dans un TextView à partir d'un Activity.Changer la couleur du texte d'un mot dans un TextView

Par exemple, ceci:

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

Comment pourrais-je changer la couleur du texte next au rouge?

+1

double possible de [? Est-il possible d'avoir plusieurs styles dans un TextView] (http://stackoverflow.com/questions/1529068/is-it- possible-avoir-plusieurs-styles-dans-un-textview) – blahdiblah

+0

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

Répondre

130

Le moyen le plus simple que je connaisse est de simplement utiliser html.

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

Mais cela vous demandera de reconstruire le TextView quand (si?) Vous voulez changer la couleur, ce qui pourrait causer un problème.

+1

Ceci est certainement le moyen le plus simple, mais la couleur ne devrait pas être color = '# EE0000' le symbole dièse est nécessaire pour indiquer une couleur hexadécimale. – Tom

+0

Correction, merci! Je ne me souviens pas si je l'ai copié à partir du code réel ou de la mémoire avec un site Web de générateur de couleur, donc il n'a peut-être pas travaillé auparavant. – Dan

+0

Ok juste pour être sûr! En outre, comme je l'ai découvert, vous ne pouvez pas utiliser de codes hexadécimaux à 8 chiffres, donc pas de composante alpha. Celui-là m'a bloqué pendant un moment. – 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); 

vous devez utiliser spannable cela vous permet également d'augmenter la taille du texte, mettre en gras etc .... même mettre dans une image.

+4

Bonne réponse, merci. Dans ce cas, "s.length()" peut être utilisé à la place de "start + next.length()": int end = s.length(); – Oleg

+1

Dans le cas où quelqu'un cherche Xamarin.Android Solution. Vous pouvez assigner l'objet 'SpannableString' en utilisant la propriété' TextFormatted' de votre contrôle. – CodeIt

+0

Impossible de faire fonctionner cela.Terminé en allant avec la solution de B K. –

2

Si vous voulez changer l'état de toutes les instances d'un String dans un texte TextView spécifique (insensible à la casse), vous pouvez utiliser StringBuilder s et SpannableString comme ceci:

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

}

  • Stockez le texte entier TextView à l'intérieur d'un StringBuilder.
  • Stockez la chaîne recherchée dans un StringBuilder.
  • le magasin wholre texte TextView dans un SpannableString
  • Faire une simple opération de trouver toutes les instances String dans le texte et les TextView changer lorsqu'il est atteint.
  • Définissez la valeur de texte du TextView sur SpannableString.
15

Utilisez SpannableStringBuilder comme ceci:

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

Y at-il quelque chose que je puisse remplacer 'new ForegroundColorSpan (Color)' par pour que le texte conserve sa couleur par défaut d'origine? – cjnash

Questions connexes