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

Car*_*ine 90 java xml android

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

我该怎么做?

Dav*_*son 153

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

<resource>
    <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于其他发现官方Android文档的人来说,如果你在字符串资源中使用<b>这样的标签,请确保使用`getText(R.string.whatever)`而不是`getString( R.string.whatever)` (108认同)
  • 此外,根据您使用资源字符串的方式,您可能需要将粗体/斜体标记放在CDATA块中,这样它们就不会被解析,直到它被`Html.fromHtml()`:...`<![ CDATA [<b> <i>所以</ i> </ b>]]>`... (13认同)
  • @andygeers 对于像“My name is &lt;b&gt;%s&lt;/b&gt;”这样不能使用 getText 因为它只接受单个参数的字符串我们能做什么? (4认同)
  • 尽管如此,我仍然面临一个问题,在 String.xml 文件内的字符串之间使用 %1$s 。getString(v1, v2) 不能替换为 getText(v1, v2) (3认同)
  • 因此不需要`Html.fromHtml`或`Spannable`。就像提到的@andygeers一样使用`getText(R.string.whatever)`。 (2认同)

小智 29

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

<resources>
<string name="string_resource_name"><![CDATA[<b> Your text </b>]]> </string>
</resources>
Run Code Online (Sandbox Code Playgroud)

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

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));
Run Code Online (Sandbox Code Playgroud)


and*_*ers 25

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

<resource>
    <string name="my_string">A string with <i>actual</i> <b>formatting</b>!</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后,如果你使用getText(R.string.my_string)而不是getString(R.string.my_string)你得到一个CharSequence而不是一个String包含格式嵌入.

  • 1+用于`getText(R.string.my_string)`...让我的一天! (4认同)

svk*_*aka 11

在 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)
}
Run Code Online (Sandbox Code Playgroud)

用法

//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")
Run Code Online (Sandbox Code Playgroud)

编辑更多扩展

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()
Run Code Online (Sandbox Code Playgroud)

  • Activity 扩展不是必需的,Activity 就是 Context 本身 (3认同)

Mah*_*man 8

来自 Android 官方网站的简单且最新的答案(使用%s%1$s等占位符)来源

首先,您将像这样添加字符串strings.xml

<string name="welcome">Welcome to <b>Android</b> %1$s, %2$s!</string>
Run Code Online (Sandbox Code Playgroud)

在这里,您将把<b 之前的 b 替换为&lt;

要像这样:

<string name="welcome">Welcome to &lt;b>Android&lt;/b> %1$s, %2$s!</string>
Run Code Online (Sandbox Code Playgroud)

在 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)
 }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

val escapedString: String = TextUtils.htmlEncode("programmers & friends")
val textView : TextView = findViewById(R.id.myTextView)
textView.text = getString(R.string.welcome, "Studio", escapedString).fromHtml()
Run Code Online (Sandbox Code Playgroud)

输出:欢迎来到Android Studio,程序员和朋友们!


kun*_*kar 6

字符串.xml

<string name="my_text"><Data><![CDATA[<b>Your text</b>]]></Data></string>
Run Code Online (Sandbox Code Playgroud)

设置

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));
Run Code Online (Sandbox Code Playgroud)