使用 Spannable 字符串设置两个第一个单词的样式
Styling Two First Words With Spannable String
我正在尝试为字符串中的前两个单词赋予一些样式效果(如粗体、删除线)。
我这样做的方式受到了这个 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);
根据上面的代码,我试图只对前两个词赋予粗体和删除线效果。但是,这些效果也适用于内容。
当我为字符串中的最后两个单词应用样式时,这段代码工作正常,但在使用第一个单词时一直失败。我怀疑这是因为 .SetSpan
的开始和结束错误(或者可能不是这种情况)...我仍然对找到开始和结束的正确索引一无所知。任何人都可以帮我解决这个问题?谢谢。
是的,你可以做到这一点。我这样做的方式(因为它是相对简单的东西)就是 HTML。所以你可以做这样的事情...
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(Html.fromHtml("<b><strike>" + twoFirstWords
+ "</b></strike>" + restOfTheSentence));
CommonsWare 有一个很棒的博客 post,其中列出了它支持的所有标签,您可以找到 here。
好了,我们有了结论。感谢 pskink!
我需要做的是,效果未应用于正在使用的内容 SPAN_EXCLUSIVE_EXCLUSIVE
。如下所示:
span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
我正在尝试为字符串中的前两个单词赋予一些样式效果(如粗体、删除线)。 我这样做的方式受到了这个 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);
根据上面的代码,我试图只对前两个词赋予粗体和删除线效果。但是,这些效果也适用于内容。
当我为字符串中的最后两个单词应用样式时,这段代码工作正常,但在使用第一个单词时一直失败。我怀疑这是因为 .SetSpan
的开始和结束错误(或者可能不是这种情况)...我仍然对找到开始和结束的正确索引一无所知。任何人都可以帮我解决这个问题?谢谢。
是的,你可以做到这一点。我这样做的方式(因为它是相对简单的东西)就是 HTML。所以你可以做这样的事情...
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(Html.fromHtml("<b><strike>" + twoFirstWords
+ "</b></strike>" + restOfTheSentence));
CommonsWare 有一个很棒的博客 post,其中列出了它支持的所有标签,您可以找到 here。
好了,我们有了结论。感谢 pskink!
我需要做的是,效果未应用于正在使用的内容 SPAN_EXCLUSIVE_EXCLUSIVE
。如下所示:
span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);