如何在Android中的同一个TextView中显示加粗和普通文本?

23
我在网上搜索并尝试了以下代码,但它没有起作用。
SpannableString ss1 = new SpannableString("Health: ");
           ss1.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, ss1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            textview1.setText("\n"+ss1+strhealth+"\n\n");

我希望输出结果像这样: 健康:

其中strhealth = 好, 但输出结果是“健康:好”。 错在哪里?

我正在使用Android Studio 2.1.1。

7个回答

26
 String txt1="Health: ";
 SpannableString txtSpannable= new SpannableString(txt1);
 StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
 txtSpannable.setSpan(boldSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

 builder.append(txtSpannable);

 String txt2="good";
 builder.append(txt2);

 textview1.lblStatus.setText(builder, TextView.BufferType.SPANNABLE);

3
最好不要硬编码长度为8,而是使用txt1.length()。 - ka3ak

10
最简单的方法是:
textview1.setText(Html.fromHtml("<b>Health:</b> good"));

您的代码中的错误在于在此处使用字符串拼接:"\n"+ss1+strhealth+"\n\n",这会剥离所有格式,因为组件被视为普通字符串。

如果我不连接字符串,那么如何将一个变量和多个文本放在一个单一的文本视图中? - G.ONE
我尝试使用以下代码:textview1.setText(Html.fromHtml("<b>Health:</b>")+strhealth+"\n\n"); 但输出仍然没有将 Health: 加粗。 - G.ONE
和你之前尝试的一样出现了问题。请使用以下代码:textview1.setText(Html.fromHtml("<b>健康:</b>"+strhealth+"\n\n")); - Henry
谢谢,它正在工作,但现在我必须使用HTML来格式化文本视图中的所有内容。现在文本视图的属性(例如居中)不起作用了。 - G.ONE

10

在 Kotlin 中,你可以这样做。我用它来使字符串中的字符/单词加粗。例如:

item = "Philippines"

query = "Phil"

result = Philippines

val spannable = SpannableString(item)
val indexStart = item.indexOf(query)
val indexEnd = indexStart + query.length
spannable.setSpan(StyleSpan(Typeface.BOLD), indexStart, indexEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

然后像这样使用它

textView.text = spannable

7

我有点晚回答,但我创建了一种方法,以便使用已经提供的答案。

    private void setSpanString(String string1, String string2, TextView textView) {
    SpannableStringBuilder builder=new SpannableStringBuilder();
    SpannableString txtSpannable= new SpannableString(string1);
    StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
    txtSpannable.setSpan(boldSpan, 0, string1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.append(txtSpannable);
    builder.append(string2);
   textView.setText(builder, TextView.BufferType.SPANNABLE);
}

4
我会使用这样的字符串资源,比如:

<string name="health_status"><b>Health:</b> %1$s</string>

当您想设置健康状态时,只需使用以下代码:
String ss1 = getString(R.string.health_status, strhealth);

2
以下是您可以使用的代码,通过它您可以在Kotlin中创建SpannableString。
val spannableStringBuilder = SpannableStringBuilder()

val boldSpan: StyleSpan = StyleSpan(Typeface.BOLD)

sp_text.setSpan(boldSpan, firstIndex, lastIndex,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

sp_text.setSpan(clickableSpan, firstIndex, lastIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            sp_text.setSpan(ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.colorPrimary)), firstIndex, lastIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

-2
我认为你应该使用两个不同的textView,一个用于标签,另一个用于数据。这是常见的好做法。

1
有时候你需要处理一个字符串,这样就需要更多的工作来将字符串分割到适当的TextView中。既然可以一箭双雕,为什么不呢? - Ivan Leong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接