如何更改 TextView 上的某些特定字符?

How to change some particular characters on TextView?

我需要更改 TextView 中每个元音字母的颜色。 例如我有 ("a", "e", "i", "o", "u") 我需要它们是这样的 -

GR<font color='green'>EE</font>N C<font color='green'>O</font>L<font color='green'>O</font>R

我正在尝试这个:

    if(text.contains("o")){
        SpannableString spanText = new SpannableString(text);

        // make "text" (characters pos-1 to pos) red
        spanText.setSpan(new ForegroundColorSpan(Color.GREEN), text.indexOf("o") - 1, text.indexOf("o"), 0);
        labelTextView.setText(spanText, TextView.BufferType.SPANNABLE);
    }

但我需要更困难的 SpannableString 更改,但不知道如何更改。 有什么建议吗?

您可以将您的个人颜色包装在 html 颜色标签中,并使用 Html.fromHtml(String string); 获得您的 Span。

如果您需要更困难的字符串颜色连接,您可以定义一种方法来将字符串的各个部分包装在 html 中并连接结果。

编辑:

我确信有更有效的方法来做到这一点,但这个方法有效。如果您想映射多种不同的颜色,则必须扩展逻辑。

public String wrapVowelsInColor(String input){
    final List<String> VOWELS = new ArrayList<>(Arrays.asList(new String[] {"a", "A", "e", "E" ,"i", "I", "o", "O", "u", "U"}));

    final char[] mChars = input.toCharArray();
    final int count = mChars.length;
    final StringBuilder builder = new StringBuilder(count);
    for(int i = 0; i < count; i++){
        String current = String.valueOf(mChars[i]);
        if(VOWELS.contains(current)){
            builder.append(wrapInColor("blue", current)));
        } else {
            builder.append(current);
        }
    }

    return builder.toString();
}

public String wrapInColor(String color, String toWrap){
    return String.format("<font color='%s'>%s</font>", color, toWrap);
}

输入:

String testString = "My test string for coloring vowels";

输出:

My t<font color='blue'>e</font>st str<font color='blue'>i</font>ng f<font color='blue'>o</font>r c<font color='blue'>o</font>l<font color='blue'>o</font>r<font color='blue'>i</font>ng v<font color='blue'>o</font>w<font color='blue'>e</font>ls

然后在 TextView.

上设置跨度之前在输出上 运行 Html.fromHtml(String string)