使用Spannable字符串设计两个第一个单词

时间:2015-06-29 08:45:06

标签: java android string spannablestring

我试图给字符串中的前两个单词赋予一些样式效果(如粗体,删除线)。 我这样做的方式受到thread的启发。

String[] tokens = text.split(" ");
String twoFirstWords = tokens[0] + " " + tokens[1]; //two first words

String content = text.replaceFirst(twoFirstWords, " "); //the rest

SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString span1 = new SpannableString(twoFirstWords);
SpannableString span2 = new SpannableString(content);
span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span1.setSpan(new StrikethroughSpan(),0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE );
span1.setSpan(new CustomTypefaceSpan("", fontFirst), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span2.setSpan(new CustomTypefaceSpan("", fontContent), 0, content.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);

builder.append(span1);
builder.append(span2);
textView.setText(builder, TextView.BufferType.SPANNABLE);

基于上面的代码,我试图仅对两个第一个单词给出BOLD和Strikethrough效果。但是,这些效果也适用于内容。

当我在字符串中为两个最后一个单词应用样式时,此代码工作正常,但在使用第一个单词时仍然失败。我怀疑这是因为.SetSpan的错误开始和结束(或者可能不是这样)...我仍然无法找到正确的开始和结束索引..任何人都可以帮我修复这个问题?谢谢。

2 个答案:

答案 0 :(得分:0)

是的,你可以这样做。我这样做的方式(因为它是相对简单的东西)只是用HTML。所以你可以这样做......

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

textView.setText(Html.fromHtml("<b><strike>" + twoFirstWords 
    + "</b></strike>" +  restOfTheSentence));

CommonsWare有一篇很棒的博客文章,其中列出了您支持的所有标记here

答案 1 :(得分:0)

好的,我们得出结论。感谢pskink!

我需要做什么,因此效果不适用于使用SPAN_EXCLUSIVE_EXCLUSIVE的内容。如下所示:

span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);