如何在运行时在android中使部分文本加粗?
Posted
技术标签:
【中文标题】如何在运行时在android中使部分文本加粗?【英文标题】:How to make part of the text Bold in android at runtime? 【发布时间】:2012-06-14 08:11:35 【问题描述】:我的应用程序中的ListView
有许多字符串元素,例如name
、experience
、date of joining
等。我只想使name
加粗。所有字符串元素都将在一个 TextView
中。
我的XML
:
<ImageView
android:id="@+id/logo"
android:layout_
android:layout_
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="15dp" >
</ImageView>
<TextView
android:id="@+id/label"
android:layout_
android:layout_
android:layout_toRightOf="@id/logo"
android:padding="5dp"
android:textSize="12dp" >
</TextView>
我设置 ListView 项的 TextView 的代码:
holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf);
【问题讨论】:
【参考方案1】:假设您有一个名为etx
的TextView
。然后,您将使用以下代码:
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);
【讨论】:
对于 Xamarin,像这样使用var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
对于 Xamarin,etx.TextFormatted = sb;
【参考方案2】:
根据 Imran Rana 的回答,如果您需要将 StyleSpan
s 应用于多个 TextView
s 并支持多种语言(其中索引是可变的),这是一种通用的、可重用的方法:
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>
结果:
欢迎来到公司名称
【讨论】:
非常酷,谢谢。【参考方案3】:您可以使用 Kotlin 和 core-ktx
中的 buildSpannedString
扩展函数来完成此操作
holder.textView.text = buildSpannedString
bold append("$name\n")
append("$experience $dateOfJoining")
【讨论】:
【参考方案4】:此处提供的答案是正确的,但不能在循环中调用,因为StyleSpan
对象是单个连续跨度(不是可以应用于多个跨度的样式)。使用相同的粗体StyleSpan
多次调用setSpan
将创建一个粗体跨度,然后在父跨度中移动它。
就我而言(显示搜索结果),我需要使所有搜索关键字的所有实例都显示为粗体。这就是我所做的:
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;
请记住,如果一个关键字是另一个关键字的子字符串,则上面的代码不足以跳过双粗体。例如,如果您在 “Fishs in the fisty Sea” 中搜索 “Fish fi”,它会将 “fish” 加粗一次,然后然后是 "fi" 部分。好消息是,虽然效率低且有点不受欢迎,但它不会有视觉缺陷,因为您显示的结果仍然看起来像
鱼在fisty海
【讨论】:
嘿,伙计,你能看看这个***.com/questions/59947482/…【参考方案5】:如果您不确切知道要加粗的文本部分之前的文本长度,或者甚至不知道要加粗的文本的长度,您可以轻松地使用 html 标签,例如以下:
yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
【讨论】:
【参考方案6】:我建议使用带有 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) ));
【讨论】:
【参考方案7】:将 Frieder 的答案扩展到支持大小写和变音符号不敏感。
public static String stripDiacritics(String s)
s = Normalizer.normalize(s, Normalizer.Form.NFD);
s = s.replaceAll("[\\pInCombiningDiacriticalMarks]", "");
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);
【讨论】:
【参考方案8】:如果您使用@srings / your_string 注释,请访问strings.xml 文件并在您想要的文本部分使用<b></b>
标记。
例子:
<string><b>Bold Text</b><i>italic</i>Normal Text</string>
【讨论】:
【参考方案9】:<string name="My_Name">Given name is <b>Not Right</b>Please try again </string>
在 string.xml 文件中使用“b”标签。 也适用于斜体“i”和下划线“u”。
【讨论】:
以上是关于如何在运行时在android中使部分文本加粗?的主要内容,如果未能解决你的问题,请参考以下文章