我有一个字符串数组:
String[] words = {"spades", "hearts", " diamonds", "clubs"};
我想将TextView中所有这些单词出现的文本颜色从常规黑色更改为红色。我该怎么做呢(如果有办法的话)?谢谢!
答案 0 :(得分:4)
您可以使用SpannableString
轻松完成此操作。假设您要在字符串abc
绿色中填充fooabcbar
:
String s = "fooabcfoo";
SpannableString spannable = new SpannableString(s);
spannable.setSpan(new ForegroundColorSpan(Color.GREEN), 3, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE));
view.setText(spannable)
这基本上是杰克逊在幕后建议的Html.fromHtml()
。
.setSpan()
的最后一个参数控制在跨度边缘插入字符时跨度如何变化。 “独占”意味着跨度不会延伸到覆盖新角色。如果TextView
不可编辑,那么放在那里实际上并不重要。
您可以在字符串中添加任意数量的跨度,这样您就可以轻松遍历字符串,查找要突出显示的单词,并为每个字符串添加跨度。
还有很多其他可以添加的跨度,可以控制字体和其他类型的装饰。您甚至可以创建自己的跨度来调用任意绘图命令,这可以通过在.draw()
中实现ReplacementSpan
方法来完成。
答案 1 :(得分:1)
(下面介绍了一种不使用 SpannableString
的方法,因为直到现在我还没有遇到过这种情况。那么,那是什么&#39关于,学习新事物 :))
您可以做的是使用简单的HTML
标记,并使用经过content
的Java方法动态构建HTML字符串,插入HTML <font color='#FF0000'>
和</font>
每当遇到与words[]
中的任何字符串匹配的单词时,都会使用标记。像这样的东西:
String[] words = {"spades", "hearts", " diamonds", "clubs"};
String content = "Lorem Ipsum" //the raw text to put in the TextView;
String[] splitcontent = text.split(" "));
for (int i = 0; i < array.length; i++) {
if (/*splitcontent[i].toLowerCase(Locale.getDefault()) == any word in string array (use RegExp)*/) {
/*insert html tag before and after word within splitcontent*/;
}
}
String htmlstring = splitcontent.method()/*merge array entries back together with spaces*/;
myTextView.setText(Html.fromHtml(htmlstring));