安卓中一个TextView中如何显示多种颜色

59

可能重复的问题:
是否可以在TextView中有多种文本样式?

我想让我的TextView展示部分红色文字和部分黑色文字。它的内容(文字)是动态创建的,我不知道有多少单词需要变成红色。

是否有办法像html-css一样来实现这个效果?


我已经为此创建了一些库。如果您发现任何问题,请随时查看并在其中发布问题 https://github.com/ha-yi/MultiColorTextView - Hayi Nukman
我不理解你的 Github 收藏。 - user9599745
3个回答

100

您可以使用Spannable来实现您想要的效果。

String text = "This is <font color='red'>red</font>. This is <font color='blue'>blue</font>.";

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(text,  Html.FROM_HTML_MODE_LEGACY), TextView.BufferType.SPANNABLE);
} else {
   textView.setText(Html.fromHtml(text), TextView.BufferType.SPANNABLE);
}

我们能否同样设置文本的一部分背景? - Viral Patel
2
你也可以将这个字符串放在 strings.xml 中(但你必须用 <![CDATA[**你的字符串在此**]]> 包围它)。然后,像他说的那样设置字符串,但你不需要使用 TextView.BufferType.SPANNABLE。 - Daniel Handojo

92

尝试这种方式

    TextView tv = (TextView)findViewById(R.id.tv);

    Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        
    wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    wordtoSpan.setSpan(new ForegroundColorSpan(Color.RED), 5, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.setText(wordtoSpan);

1
OP已经说过他不知道文本中会有多少单词,这就排除了使用硬编码位置的任何解决方案。 - tbm
1
@tbm 我刚刚提出了一个简单的解决方案,基于这个方案,我们可以制作一个动态的效果,例如从句子“你好”中,“你”这个词应该显示为红色,“再见”这个词应该显示为蓝色,以此类推。为此,我们需要获取动态位置,然后根据它添加我们的逻辑。 - Khan
4
如果不想硬编码它们,就即时计算它们。我喜欢这个答案。 - Bernard Igiri
2
这是一个比被接受的答案更好、资源消耗更少的解决方案。它不需要对文本进行不必要的解析。 - Melllvar

7

你需要的基本上是 SpannableString

参考这个完整示例


感谢 SpannableStrings 解决了它。 - Hüseyin Z.
是的,我检查了我使用的那个 :) 但非常感谢,我只能选择一个。 - Hüseyin Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接