Android 中 strings.xml 字符串中的粗体单词

我在 strings.xml 的一个字符串中有一段很长的文本。我想加粗并改变文本中某些词的颜色。

我该怎么做?

164408 次浏览

你基本上可以在你的字符串资源中使用 html 标记,比如:

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

并且使用 Html.from Html 或者使用 spannable,检查我发布的链接。

旧的类似问题: 是否有可能在 TextView 中包含多个样式?

在字符串资源中使用 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));

正如 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

你可以用绳子

 <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());

在 kotlin 中,您可以在资源上创建扩展函数(actives| 片段 | context) ,将字符串转换为 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()

Xml

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

Page.java

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

这个价格 5.21美元

Xml

<string name="my_text"><Data><![CDATA[<b>Your text</b>]]></Data></string>

布景

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

我收到了一条短信:

忘记密码了? 重设这里。

为了实现这个简单的方法,我使用了现有的 android: textStyle = “ bold”

<LinearLayout
android:id="@+id/forgotPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>




<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="all"
android:linksClickable="false"
android:selectAllOnFocus="false"


android:text="Forgot password? "
android:textAlignment="center"
android:textColor="@android:color/white"
/>


<TextView


android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="all"
android:linksClickable="false"
android:selectAllOnFocus="false"


android:text="Reset here"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textStyle="bold" />
</LinearLayout>

也许能帮到别人

在 Kotlin,我为 Context 创建了一个扩展函数。它接受一个 @ StringRes,您还可以选择提供参数。

fun Context.fromHtmlWithParams(@StringRes stringRes: Int, parameter : String? = null) : Spanned {


val stringText = if (parameter.isNullOrEmpty()) {
this.getString(stringRes)
} else {
this.getString(stringRes, parameter)
}


return Html.fromHtml(stringText, Html.FROM_HTML_MODE_LEGACY)


}

用法

tv_directors.text = context?.fromHtmlWithParams(R.string.directors, movie.Director)

如果要存储格式化为字符串变量并将其重用于文本视图,则不可能

如果不应用格式设置,可以直接设置 TextView 文本 通过调用 setText (java.lang.CharSequence), 您可能希望创建一个样式化的文本资源,该资源也用作格式字符串 。通常情况下,这不起作用,因为 Format (String,Object...)和 getString (int,Object...)方法 从字符串中去掉 所有的样式信息。解决这个问题的方法是使用转义实体编写 HTML 标记,这些实体是 然后使用 from Html (String)在格式化之后恢复 地点。

所以可以选择使用 Htlm.FROM Html () . . method 存储字符串 id 和每次绑定 get string。

例如:

Kotlin 分机

fun Context.getStringFromResource(stringId: Int): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(java.lang.String.format(resources.getString(stringId)),
Html.FROM_HTML_MODE_COMPACT)
} else {
Html.fromHtml(java.lang.String.format(resources.getString(stringId)))
}
}

代码:

getStringFromResource(id)

这里是 string.xml 文件中是否有任何指定值的解决方案。

 <string name="styled_welcome_message"><![CDATA[We are <b> %1$s </b>  glad to see you.]]></string>

设置为 TextView:

textView?.setText(HtmlCompat.fromHtml(getString(R.string.styled_welcome_message, "sample"), HtmlCompat.FROM_HTML_MODE_LEGACY), TextView.BufferType.SPANNABLE)

附注: 不要忘记将文本(在字符串资源中)包装在:

<![CDATA[ YOUR TEXT HERE ]]>

如果要在字符串资源中使用基本的 HTML 标记,则必须转义标记,否则将忽略它们。 简单地,将’<’替换为 & lt; ,’>’替换为’& gt;’ 例如:

<string name="bold_statement">This is a &lt;bold&gt; statement</string>

将产生: 这是一个 大胆语句。 加载 String 资源时,请确保使用

HtmlCompat.fromHtml(stringFromResource, HtmlCompat.FROM_HTML_MODE_COMPACT)

来自官方 Android 站点的简单和最新的回答 : < a href = “ https://developer.Android.com/guide/questions/resources/string-resource # StylingWithHTML”rel = “ nofollow noReferrer”> source

首先,在 strings.xml中添加字符串,如下所示:

<string name="welcome">Welcome to <b>Android</b>!</string>

这里你将用 &lt;代替 b 前面的 <

像这样:

<string name="welcome">Welcome to &lt;b>Android&lt;/b>!</string>

在 kotlin 代码中,您将创建一个扩展来解析来自 html 的字符串:

fun String.fromHtml(): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
// we are using this flag to give a consistent behaviour
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(this)
}
}

然后像这样使用它:

getString(R.string.welcome).fromHtml()

假设您想要像下面这样格式良好的字符串:

enter image description here

我这样做:

    <string name="dialog_upgrade_item_fx_output_text">
"[B]Unlimited support for up to 5 audio effects per audio track[/B]\n
- Multiple high quality effects available Reverb, Delay, Distortion, Compressor, Equalizer\n
- Each comes with various presets or create your own"
</string>


fun Context.formatted(resId: Int): Spanned =
Html.fromHtml(getString(resId).replace("\n", "<br>")
.replace("[B]", "<b>").replace("[/B]", "</b>"), 0)


textView(R.id.dialog_upgrade_item_text)
.text(formatted(R.string.dialog_upgrade_item_fx_output_text))