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

时间:2015-04-15 15:49:12

标签: android spannable

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



GR<font color='green'>EE</font>N C<font color='green'>O</font>L<font color='green'>O</font>R
&#13;
&#13;
&#13;

我正在尝试这个:

    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,但不知道如何。 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

如果你需要一个更难的字符串颜色连接,你可以定义一个方法来在你的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

然后在Html.fromHtml(String string)上设置范围之前,先在输出上运行TextView