Spannables不在TextView中着色文本

时间:2014-11-10 15:56:55

标签: java android textview spannablestring

我正在尝试为一个单词的最后两个字母着色,但是当我应用跨度时,没有任何事情发生。

以下是应用范围的代码:

oldWordTextView.setHighlightStatus(true);
    //Span koji uzima cijeli tekst
    String word = oldWordTextView.getText().toString();
    Log.w(word, "Rijec za animiranje highlight");
    Log.w("U animiranju prefixa", "Aniamte");
    if(word != "" && word != " "){
    final SpannableStringBuilder oldSb = new SpannableStringBuilder(word);
    final SpannableStringBuilder currentSb = new SpannableStringBuilder(buffer);

    //Span za mijenjanje boje
    final ForegroundColorSpan greenSpan = new ForegroundColorSpan(Color.rgb(60, 184, 120));//Green
    final ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.rgb(251, 43, 51));//Red
    Spannable wordToSpan = new SpannableString(word);

    if(isValid){
        wordToSpan.setSpan(greenSpan, word.length() - 2, word.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        oldSb.setSpan(greenSpan, word.length() - 2, word.length() - 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        if(buffer != "" && buffer != " ") currentSb.setSpan(greenSpan, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        oldWordTextView.setText(wordToSpan, BufferType.SPANNABLE);
        //staticTextView.setText(currentSb);
        isHighlightDone = true;
    }
    else{
        oldSb.setSpan(redSpan, 0, word.length() - 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        if(buffer != "" && buffer != " ") currentSb.setSpan(redSpan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        oldWordTextView.setText(oldSb);
        staticTextView.setText(currentSb);
    }
    }

这是我的TextView类,因为它是自定义的:http://pastebin.com/4qxL3m82

谢谢!

编辑:我已经测试并推断出问题出在我的自定义textview类中。我尝试在onDraw和onLayout方法中应用span,但textView保持不变。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

最简单的方法是在字符串中包含HTML:

String str = "This word is <font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(str));

答案 1 :(得分:0)

为了显示SpannableString,您还需要传递这样的标志:

textView.setText(spannableString, TextView.BufferType.SPANNABLE);

我个人更喜欢创建实用程序函数来为给定String的某些部分着色。例如,假设您需要一个功能来突出显示一个单个字符,并以其他颜色着色其他字符。你可以实现类似的东西:

// this function colors the k-th character of String s in blue and the rest in red, and returns the SpannableString
public static SpannableString highlight(String s, int k) {
        SpannableString ss = new SpannableString(s);
        ss.setSpan(new ForegroundColorSpan(Color.BLUE), 0, k, 0);
        ss.setSpan(new ForegroundColorSpan(Color.RED), k, k + 1, 0);
        ss.setSpan(new ForegroundColorSpan(Color.BLUE), k + 1, s.length(), 0);
        return ss;
    }

编辑:好吧,我看到问题是您的方法applyLetterSpacing只是忽略了旧的跨度。因此,我想到的第一个解决方案是在调用setText时保存范围并在调用applyLetterSpacing时应用它们。你可以在http://pastebin.com/p4Hig8Pj看到这个想法,尽管正如我在评论中所说,在onDrawonLayout中使用自定义着色器会使着色效果完全出乎意料。希望它有所帮助。