SpannableStringBuilder创buildstring与多个字体/文本大小等。

我需要创build一个string放在一个TextView中,将显示一个string,如下所示:

第一部分不粗体BOLDrest不粗体

所以我想知道如何使用SpannableStringBuilder来做到这一点?

我可以使用三个TextEdit来完成这个,但我想用最好的解决scheme。

 First Part Not Bold BOLD rest not bold 

你可以这样做@Rajeshbuild议或由此。

 String normalBefore= "First Part Not Bold "; String normalBOLD= "BOLD "; String normalAfter= "rest not bold"; String finalString= normalBefore+normalBOLD+normalAfter; Spannable sb = new SpannableString( finalString ); sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //bold sb.setSpan(new AbsoluteSizeSpan(intSize), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//resize size 

在TextView中显示

 textview.setText(sb); 

接受的答案是好的(和我upvoted它),但它没有使用SpannableStringBuilder作为提交人请求。 因为我有一个Builder最有意义的例子,下面是这个代码(如果这对别人有帮助的话,还可以改变文本的颜色)。 请注意,您也可以将初始string提供给SpannableStringBuilder构造函数,但是我在此将其设置为使用“append”来清楚地说明您可以在所需的“粗体”文本之前添加大量字符,然后只logging所示的开始。 我会怀疑这是比接受的答案更快的代码。

 SpannableStringBuilder longDescription = new SpannableStringBuilder(); longDescription.append("First Part Not Bold "); int start = longDescription.length(); longDescription.append("BOLD"); longDescription.setSpan(new ForegroundColorSpan(0xFFCC5500), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); longDescription.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); longDescription.append(" rest not bold"); 

从API 21 SpannableStringBuilder包含一个简单的方法来做到这一点。 以下是一个解决scheme示例:

 SpannableStringBuilder builder= new SpannableStringBuilder(); StyleSpan boldSpan = new StyleSpan(android.graphics.Typeface.BOLD); builder.append("First Part Not Bold ") .append("BOLD ", boldSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) .append("rest not bold"); 

由于您很可能不支持API 21,所以您可以复制该方法的代码:

 public SpannableStringBuilder append(CharSequence text, Object what, int flags) { int start = length(); append(text); setSpan(what, start, length(), flags); return this; } 

使用HTML类在TextView中使用HTML代码:

 Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold"); textView.setText(styledText); 

所以我知道这已经解决了,即使按照SpannableStringBuilder的要求,但是如果你想更dynamic地创build一个string,我想我会把这个。

 // Stuff needed TextView DataTextView = (TextView)rootView.findViewById(R.id.DataView); String Fields[] = {...database column names as strings... "x","y"}; String DataString = new String(); int start,stop; // Start and Stop of formatting // Final Result SpannableStringBuilder coloredString = new SpannableStringBuilder(); SpannableString temp; // Small segment of colored string for (int i =0; i < Fields.length; i++) { if (database_result.containsKey(Fields[i])) // Be sure a field exists in the ContentValues { DataString = Fields[i]+": "; start = DataString.length(); DataString = DataString+ +database_result.getAsInteger(Fields[i])+" "; stop= DataString.length(); temp = new SpannableString(DataString); temp.setSpan(new ForegroundColorSpan(Color.WHITE),start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); coloredString.append(temp); } } DataTextView.setText(coloredString); 

database_result是我从返回的SQL查询的Cursortypes构造的一个ContentValuestypes。 我遇到的唯一问题是,起初它只是ColorSpaning的第一部分。 它接缝,你需要声明一个新的ForegroundColorSpan每次你想使用一个(或任何其他types的跨度)在循环中。

这段代码应该设置为加粗html标签内的所有内容。 它也会删除标签,所以只显示里面的内容。

  SpannableStringBuilder sb = new SpannableStringBuilder("this is <b>bold</b> and this is <b>bold too</b> and this is <b>bold too, again</b>."); Pattern p = Pattern.compile("<b>.*?</b>", Pattern.CASE_INSENSITIVE); boolean stop = false; while (!stop) { Matcher m = p.matcher(sb.toString()); if (m.find()) { sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); sb.delete(m.end()-4, m.end()); sb.delete(m.start(), m.start() + 3); } else stop = true; } 

此代码也可以适用于其他html样式标签,如Superscript(sup标签)等。

  SpannableStringBuilder sb = new SpannableStringBuilder("text has <sup>superscript</sup> tag"); Pattern p = Pattern.compile("<sup>.*?</sup>", Pattern.CASE_INSENSITIVE); boolean stop = false; while (!stop) { Matcher m = p.matcher(sb.toString()); if (m.find()) { sb.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); sb.delete(m.end()-6, m.end()); sb.delete(m.start(), m.start() + 5); } else stop = true; } 

要设置颜色,只需使用带有setSpan的ForegroundColorSpan即可。

 sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

希望能帮助到你。

当你可以使用SpannableBuilder时,为什么要使用SpannableStringBuilder? ( https://gist.github.com/qtyq/90f9b4894069a8b3676c

 SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold") .makeBold("BOLD") .create() 

我们也可以使用SpannableStringBuilder和TextAppearanceSpan来实现这一点。 按照下面的步骤执行。

  1. styles.xml创build一个样式。
 <style name="BoldStyle"> <!-- Can add other styling attributes --> <item name="android:textStyle">bold</item> ...... </style>