我正在尝试为一个单词的最后两个字母着色,但是当我应用跨度时,没有任何事情发生。
以下是应用范围的代码:
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保持不变。有什么想法吗?
答案 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看到这个想法,尽管正如我在评论中所说,在onDraw
和onLayout
中使用自定义着色器会使着色效果完全出乎意料。希望它有所帮助。