更改TextView中特定单词的颜色

时间:2016-03-01 02:10:45

标签: java android android-layout textview

我有一个字符串数组:

String[] words = {"spades", "hearts", " diamonds", "clubs"};

我想将TextView中所有这些单词出现的文本颜色从常规黑色更改为红色。我该怎么做呢(如果有办法的话)?谢谢!

2 个答案:

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