在运行时android如何使文本的一部分粗体?

在我的应用程序中有一个ListView有许多string元素,如nameexperiencedate of joining等。我只是想让name加粗。 所有的string元素将在一个单一的TextView

我的XML:

 <ImageView android:id="@+id/logo" android:layout_width="55dp" android:layout_height="55dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="15dp" > </ImageView> <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/logo" android:padding="5dp" android:textSize="12dp" > </TextView> 

我的代码来设置ListView项目的TextView:

 holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf); 

假设你有一个叫做etxTextView 。 然后你会使用下面的代码:

 final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO"); final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic etx.setText(sb); 

根据Imran Rana的回答,如果您需要将StyleSpan应用于多个TextView ,并且支持多种语言(索引是可变的),那么这里是一个通用的,可重用的方法:

 void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) { SpannableStringBuilder sb = new SpannableStringBuilder(text); int start = text.indexOf(spanText); int end = start + spanText.length(); sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textView.setText(sb); } 

在像这样的Activity使用它:

 @Override protected void onCreate(Bundle savedInstanceState) { // ... StyleSpan boldStyle = new StyleSpan(Typeface.BOLD); setTextWithSpan((TextView) findViewById(R.id.welcome_text), getString(R.string.welcome_text), getString(R.string.welcome_text_bold), boldStyle); // ... } 

strings.xml

 <string name="welcome_text">Welcome to CompanyName</string> <string name="welcome_text_bold">CompanyName</string> 

结果:

欢迎来到CompanyName

这里提供的答案是正确的,但不能在循环中调用,因为StyleSpan对象是单个连续的跨度(不是可应用于多个跨度的样式)。 使用相同的粗体StyleSpan多次调用setSpan会创build一个粗体跨度,并在父跨度中移动它。

在我的情况下(显示search结果),我需要使所有search关键字的所有实例显示为粗体。 这就是我所做的:

 private static SpannableStringBuilder emboldenKeywords(final String text, final String[] searchKeywords) { // searching in the lower case text to make sure we catch all cases final String loweredMasterText = text.toLowerCase(Locale.ENGLISH); final SpannableStringBuilder span = new SpannableStringBuilder(text); // for each keyword for (final String keyword : searchKeywords) { // lower the keyword to catch both lower and upper case chars final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH); // start at the beginning of the master text int offset = 0; int start; final int len = keyword.length(); // let's calculate this outside the 'while' while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) { // make it bold span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE); // move your offset pointer offset = start + len; } } // put it in your TextView and smoke it! return span; } 

请记住,如果一个关键字是另一个关键字的子string,上面的代码不够聪明,可以跳过双粗体。 例如,如果您在“汹涌的海中的 鱼”中search“Fish fi” ,则会使“fish”变成粗体,然后变成“fi”部分。 好的是,虽然效率低下,有点不受欢迎,但它不会有视觉上的缺点,因为你的显示效果仍然看起来像

在菲律宾海域钓鱼

扩展弗雷德的答案支持案件和变音不敏感。

 public static String stripDiacritics(String s) { s = Normalizer.normalize(s, Normalizer.Form.NFD); s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); return s; } public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) { SpannableStringBuilder sb = new SpannableStringBuilder(text); int start; if (caseDiacriticsInsensitive) { start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US)); } else { start = text.indexOf(spanText); } int end = start + spanText.length(); if (start > -1) sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textView.setText(sb); } 

如果您不知道文本部分的文本长度是否要加粗,或者甚至不知道文本的长度是否为粗体,则可以轻松使用以下HTML标记:

 yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after")); 

我build议使用CDATA的strings.xml文件

 <string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string> 

然后在java文件中:

 TextView myTextView = (TextView) this.findViewById(R.id.myTextView); myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));