Android中string.xml字符串中的粗体字


114

我在strings.xml的字符串之一中有一个长文本。我要加粗并更改该文本中某些单词的颜色。

我该怎么做?


就整体目标而言,您能否更具体一些?
布莱恩(Brian)

Answers:


192

您基本上可以在字符串资源中使用html标签,例如:

<resource>
    <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

并使用Html.fromHtml或使用spannable,请检查我发布的链接。

类似的老问题:TextView中是否可以有多种样式?


16
另外,根据您使用资源字符串的方式,您可能需要将粗体/斜体标签放在CDATA块中,以便在以下情况使用它们之前就不会对其进行解析Html.fromHtml():... <![CDATA[<b><i>so</i></b>]]>...
dule 2012年

133
对于其他在此方面发现Android官方文档太含糊的人:如果您在字符串资源中使用了<b>之类的标签,请确保使用getText(R.string.whatever)而不是getString(R.string.whatever)
andygeers

1
不是应该name代替id吗?
亨德拉·安格里安

4
因此,不需要Html.fromHtmlSpannable。就像getText(R.string.whatever)提到的@andygeers 一样使用。
Alaa M.

1
@andygeers对于“我的名字是<b>%s </ b>”之类的字符串,该字符串只能接受一个参数,因此不能使用getText怎么办?
泰勒

45

在字符串资源内使用html标签:-

<resources>
<string name="string_resource_name"><![CDATA[<b> Your text </b>]]> </string>
</resources>

并从字符串资源中获取粗体文本,例如:

private Spanned getSpannedText(String text) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT);
        } else {
            return Html.fromHtml(text);
        }
    }


 String s = format(context.getResources().getString(R.string.string_resource_name));
 textView.setText(getSpannedText(s));

这是最好的答案,它完全适用于使用@BindingAdapter的人员。谢谢兄弟
Sup.Ia

43

正如David Olsson所说的,您可以在字符串资源中使用HTML:

<resource>
    <string name="my_string">A string with <i>actual</i> <b>formatting</b>!</string>
</resources>

然后,如果您使用getText(R.string.my_string)而不是getString(R.string.my_string),则返回一个CharSequence而不是String包含嵌入式格式的。


getText返回CharSequence不是Spanable
Tigran Babajanyan,

1
如果您的字符串是需要添加数字的数量怎么办?
泰勒

getText不允许您使用占位符
Vincent_Paing

10

在kotlin中,您可以在资源(活动|片段|上下文)上创建扩展功能,这些功能会将您的字符串转换为html span

例如

fun Resources.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Resources.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = getQuantityString(id, quantity).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

fun String.toHtmlSpan(): Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
    Html.fromHtml(this)
}

用法

//your strings.xml
<string name="greeting"><![CDATA[<b>Hello %s!</b><br>]]>This is newline</string>

//in your fragment or activity
resources.getHtmlSpannedString(R.string.greeting, "World")

编辑更多扩展

fun Context.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Context.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Activity.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Activity.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Fragment.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Fragment.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

@Himanshu Mori一些代码片段会有所帮助。您在Kotlin课堂上使用它吗?
svkaka

1
活动扩展不是必需的,活动本身就是上下文
Farshad Tahmasbi

2

Strings.xml

<string name="my_text"><Data><![CDATA[<b>Well Done !</b><br></br>All of your activities are completed.<br></br>You may now close the app.<br></br>See you again next time.]]></Data></string>

设置

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));

1

你可以从字符串做

 <resources xmlns:tools="http://schemas.android.com/tools">

 <string name="total_review"><b>Total Review: </b> </string>

 </resources>

并可以从Java代码访问它,例如

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());

1

strings.xml

<string name="sentence">This price is <b>%1$s</b> USD</string>

page.java

String successMessage = getString(R.string.message,"5.21");

这个价格5.21 USD


1
您应该使用本机功能来传递参数。只需放置“%1 $ s”而不是“ {1}”,然后调用不带replace()的getString(R.string.message,“ 5.21”)
Adrian Grygutis

文档支持以下答案:developer.android.com/guide/topics/resources/…尽管确实需要通过HTML解析器进行传递
ProjectDelta
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.