如何在TextView BOLD上制作特定的文本
我不知道如何使TextView上的特定文本成为BOLD。
它是这样的
txtResult.setText(id+" "+name);
我想输出是这样的:
1111尼尔
id
和name
是我从数据库中检索到的值的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 <b>%2$d new messages</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