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

时间:2011-08-20 08:15:53

标签: java android xml

我在strings.xml的一个字符串中有一个长文本。我想大胆改变那段文字中某些单词的颜色。

我该怎么做?

11 个答案:

答案 0 :(得分:137)

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

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

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

旧的类似问题:Is it possible to have multiple styles inside a TextView?

答案 1 :(得分:22)

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

答案 2 :(得分:16)

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

答案 3 :(得分:3)

Strings.xml

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

要设置

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这里是 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)

PS:不要忘记将您的文本(在字符串资源中)包裹在:

<![CDATA[ YOUR TEXT HERE ]]>

答案 6 :(得分:0)

您可以通过字符串

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

答案 7 :(得分:0)

strings.xml

<string name="sentence">This price is <b>{1}</b> USD</string>

page.java

String successMessage = getString(R.string.message).replace("{1}", "5.21");

此价格 5.21 美元

答案 8 :(得分:0)

我的文字类似:

忘记密码了吗?在这里重置。

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

import Foundation
import Combine

class Submodel1: ObservableObject {
    @Published var count = 0
}

class Submodel2: ObservableObject {
    var anyCancellable: [AnyCancellable] = []
    @Published var submodels: [Submodel1] = []

    init() {
        submodels.forEach({ submodel in
            anyCancellable.append(submodel.objectWillChange.sink{ [weak self] (_) in
                self?.objectWillChange.send()
            })
        })
    }
}

也许对某人有帮助

答案 9 :(得分:0)

在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)

答案 10 :(得分:0)

如果您想存储格式化为字符串变量并将其重用于文本视图是不可能的

<块引用>

如果不应用格式,可以直接设置TextView文本 通过调用 setText(java.lang.CharSequence)。然而,在某些情况下, 您可能想要创建一个也用作格式字符串的样式文本资源。通常,这不起作用,因为 format(String, Object...) 和 getString(int, Object...) 方法 strip 字符串中的所有样式信息。解决这个问题的方法是编写带有转义实体的 HTML 标签,它们是 然后用 fromHtml(String) 恢复,格式化后 地点。

by from docs so 或者存储字符串 id 和每次绑定从使用 Htlm.fromHtml().. 方法获取字符串。

例如:

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)