Android:getString()从资源中获取的字符串会丢失任何标签

30
例如:

我在资源中有一个字符串:

<string name="smth"><small>嘿,女孩们</small></string>

当我在xml资源文件中使用它(例如在一些文本视图中),

android:text="@string/smth"

没有任何问题。它考虑到“small”标签。这会使字符串变小。但是当我想像这样使用它时:

String smth = getString(R.string.smth);

someTextView.setText(Html.fromHtml(smth));

该字符串没有任何标签!!!

需要任何帮助。

Dan

5个回答

48

使用 HTML 标签及转义实体。

你的问题可以在官方文档中直接找到答案!

有时候,您可能想要创建一个样式化的文本资源,这也可以用作格式化字符串。通常,这是行不通的,因为String.format(String, Object...)方法会从字符串中删除所有样式信息。解决这个问题的方法是使用带有转义实体的 HTML 标签,这些标签在格式化完成后可以通过fromHtml(String)恢复。例如:

将您的样式化文本资源存储为 HTML 转义字符串:

<resources>
  <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
</resources>
在这个格式化的字符串中,添加了一个元素。请注意,开放符号使用HTML转义字符&lt; 进行转义。 然后按通常方式格式化字符串,但同时调用fromHtml(String)将HTML文本转换为样式化文本:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
CharSequence styledText = Html.fromHtml(text);

1
这似乎不再起作用了。当我将<b>更改为<b>时,会出现XML构建错误。 - Peter
1
看起来XML非常挑剔,你必须使用位置参数。如果你只是使用%s,并让String.format()按顺序分配它们,你将会得到一个XML构建错误。 - Peter
你引用了错误的段落,因为上面说到你不需要转义任何东西:https://dev59.com/g3A75IYBdhLWcg3wi5sr#18199543 - caw
这很好地运作了。谢谢你。我成功地使用了res.getString(R.string.welcome_messages, username, mailCount),而不是单独使用String.format(...)。 - Volker Neumann
1
完美运作。如果您正在使用androidx.core库,则建议将Html.fromHtml(text)替换为HtmlCompat.fromHtml(text,HtmlCompat.FROM_HTML_MODE_COMPACT),以确保与操作系统版本<24兼容性。 - Pratzz

13

为什么不尝试用相应的Unicode字符替换'<'、'>'和'\'?

致意。


4
为什么不将它放入CDATA节段中? - Peter

10
如果您不想使html标记被getString()移除,您需要在字符串中添加一个
 和 [![CDATA]] 标签,例如:
<string name="get_string_with_Html_tags"><Data><![CDATA[ This is an example.
        <br><br>
        <font color=\'black\'>black text:
        </font>
        <br><br>
        <font color=\'red\'>red text</font>
        <br></br> ]]> </Data></string>

9

-1

简单来说,只需将字符串放在双引号" "中。这样每次您都不需要输入相应的Unicode字符,只需使用原始文本并用双引号括起来即可。在文本周围放置引号意味着其中的内容只是纯文本的一部分,而不是旨在解析。

例如:<string name="smth">"<small>嘿女孩们</small>"</string>

此问题发生的原因是标签遵循HTML约定,因此每当您在< & >之间写入内容时,它被视为标签。Android尝试解析它。由于在strings.xml中无法解析,因此会出现错误。


2
对我不起作用。即使字符串被引用,getString()也会剥离标签。 - Ajay

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