如何在TextView BOLD上制作特定的文本

我不知道如何使TextView上的特定文本成为BOLD。

它是这样的

txtResult.setText(id+" "+name); 

我想输出是这样的:

1111尼尔

idname是我从数据库中检索到的值的variables,我想使id为粗体,但只有id所以name不会受到影响,我不知道如何做到这一点。

只需在HTML中构build您的string并将其设置为:

 String sourceString = "<b>" + id + "</b> " + name; mytextview.setText(Html.fromHtml(sourceString)); 

虽然你可以使用Html.fromHtml(),你可以使用SpannableStringBuilder更本地的方法,但这篇文章可能是很有帮助的 。

 SpannableStringBuilder str = new SpannableStringBuilder("Your awesome text"); str.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), INT_START, INT_END, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TextView tv=new TextView(context); tv.setText(str); 

我认为所选的答案没有提供令人满意的结果。 我写了我自己的函数,需要2个string; 全文和你想要的文字部分加粗。

它返回一个SpannableStringBuilder,其中“textToBold”从“text”加粗。

我发现能够使一个子string粗体而不包含在有用的标签中。

  /** * Makes a substring of a string bold. * @param text Full text * @param textToBold Text you want to make bold * @return String with bold substring */ public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold){ SpannableStringBuilder builder=new SpannableStringBuilder(); if(textToBold.length() > 0 && !textToBold.trim().equals("")){ //for counting start/end indexes String testText = text.toLowerCase(Locale.US); String testTextToBold = textToBold.toLowerCase(Locale.US); int startingIndex = testText.indexOf(testTextToBold); int endingIndex = startingIndex + testTextToBold.length(); //for counting start/end indexes if(startingIndex < 0 || endingIndex <0){ return builder.append(text); } else if(startingIndex >= 0 && endingIndex >=0){ builder.append(text); builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0); } }else{ return builder.append(text); } return builder; } 

正如wtsang02所说,使用HTML是一个昂贵的开销。 只需使用本地解决scheme。 如果不需要修改string,只需使用SpannableString,而不是SpannableStringBuilder。

 String boldText = "id"; String normalText = "name"; SpannableString str = new SpannableString(boldText + normalText); str.setSpan(new StyleSpan(Typeface.BOLD), 0, boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(str); 

如果要将多个文本设置为粗体,则这是更好的解决scheme。 我改进了Eitan的代码。 感谢Eitan。

 public static SpannableStringBuilder makeSectionOfTextBold(String text, String... textToBold) { SpannableStringBuilder builder = new SpannableStringBuilder(text); for (String textItem : textToBold) { if (textItem.length() > 0 && !textItem.trim().equals("")) { //for counting start/end indexes String testText = text.toLowerCase(Locale.US); String testTextToBold = textItem.toLowerCase(Locale.US); int startingIndex = testText.indexOf(testTextToBold); int endingIndex = startingIndex + testTextToBold.length(); if (startingIndex >= 0 && endingIndex >= 0) { builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0); } } } return builder; } 

基于@ mladj0ni的回答,我得到了下面的代码工作。 问题是,如果你使用String.format ,它会去掉 html标记,所以你必须在strings.xml中转义括号符号:

strings.xml中:

<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

code.java:

 String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99); Spanned spanned; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY); } else { spanned = Html.fromHtml(unspanned); } textView.setText(spanned); 

这比SpannableStringBuilder简单。 至于性能,如果你只显示一个string,那么用户不会注意到额外的毫秒来parsing它。

请参阅这里的文档。

如果你想使用XML中的string,你可以这样做:

strings.xml中

 <string name="test"> <![CDATA[ <b>bold!</b> normal ]]> </string> 

码:

 textView.setText(Html.fromHtml(getString(R.string.test))); 
 public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) { String resultant = null; resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast; return Html.fromHtml(resultant); } 

尝试这个。 它可以帮助确定

我创build了一个静态方法来设置 TextView和EditText的部分文本粗体

 public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex){ if(!contentData.isEmpty() && contentData.length() > endIndex) { final SpannableStringBuilder sb = new SpannableStringBuilder(contentData); final StyleSpan bss = new StyleSpan(Typeface.BOLD); // Span to make text bold final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text normal sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE); sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold sb.setSpan(iss,endIndex, contentData.length()-1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); if(mView instanceof TextView) ((TextView) mView).setText(sb); else if(mView instanceof EditText) ((EditText) mView).setText(sb); } } 

另一个更定制的代码

  /*typeFaceStyle can be passed as Typeface.NORMAL = 0; Typeface.BOLD = 1; Typeface.ITALIC = 2; Typeface.BOLD_ITALIC = 3;*/ public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex,int typeFaceStyle){ if(!contentData.isEmpty() && contentData.length() > endIndex) { final SpannableStringBuilder sb = new SpannableStringBuilder(contentData); final StyleSpan bss = new StyleSpan(typeFaceStyle); // Span to make text bold final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text italic sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE); sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold sb.setSpan(iss,endIndex,contentData.length()-1,Spanned.SPAN_INCLUSIVE_INCLUSIVE); if(mView instanceof TextView) ((TextView) mView).setText(sb); else if(mView instanceof EditText) ((EditText) mView).setText(sb); } } 

它的简单只需closures指定的文本,例如<b>"your text here:"</b>

 <string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, US</string> 

结果: 总部:美国北卡罗来纳州Mooresville