2011-08-28 62 views
67

我正在寻找一种方法来更改ActivityTextView中单个单词的文本的颜色。更改TextView中一个单词的文本颜色

例如,对于这样的:

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

我将如何改变next文字为红色的颜色吗?

+1

的[?是否有可能有一个TextView内的多个款式]可能的复制(http://stackoverflow.com/questions/1529068/is-it-可能具有多种样式的文本视图) – blahdiblah

+0

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

回答

130

我知道的最简单的方法就是使用html。

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

但是,这将需要你重建TextView时(如果?)你想改变颜色,这可能会导致麻烦。

+1

This绝对是最简单的方法,但不应将颜色设为color ='#EE0000',需要用磅符号来表示十六进制颜色。 – Tom

+0

修正了,谢谢!我不记得是否将它从实际代码或内存中复制到彩色生成器网站,因此以前可能无法使用。 – Dan

+0

好吧,只要确保!此外,我发现你不能使用8位十六进制代码,所以没有alpha分量。那个人愣了我一会儿。 – 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); 

你必须使用spannable这也可以让你增加一些文本的大小,使它粗体等....甚至放在一些图像。

+4

很好的答案,谢谢。在这种情况下,可以使用“s.length()”代替“start + next.length()”: int end = s.length(); – Oleg

+1

如果有人在寻找Xamarin.Android解决方案。您可以使用控件的“TextFormatted”属性来分配'SpannableString'对象。 – CodeIt

+0

无法正常工作。结束了B K的解决方案。 –

2

如果你想改变一个特定String的所有实例的状态TextView文本(不区分大小写)里面,你可以使用StringBuilder S和SpannableString这样的:

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

}

  • 将整个TextView文本存储在StringBuilder之内。
  • 将搜索到的字符串存储在StringBuilder中。
  • 商店内SpannableString
  • 的wholre TextView文本做一个简单的操作来发现所有的String实例TextView文本内到达时改变它们。
  • TextView的文本值设置为SpannableString
15

使用SpannableStringBuilder这样的:

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

有什么我可以取代'新的ForegroundColorSpan(颜色)'使文本保留其原始的默认颜色? – cjnash