小编典典

从 XML 中的 html 格式的字符串资源设置 TextView 文本

all

我的 里面有一些固定的字符串strings.xml,例如:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

在我的布局中,我有一个TextView我想用 html 格式的字符串填充的内容。

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

如果我这样做,则内容formattedtext只是somestring剥离任何 html 标记的内容,因此未格式化。

我知道可以使用以下方式以编程方式设置格式化文本

.setText(Html.fromHtml(somestring));

因为我在程序的其他部分使用它,它按预期工作。

要调用此函数,我需要一个Activity,但目前我的布局只是纯 XML
中的一个简单的或多或少的静态视图,我宁愿保持这种状态,以免我创建一个Activity只是为了设置一些文本。

我是否忽略了一些明显的东西?根本不可能吗?欢迎任何帮助或解决方法!

编辑:刚刚尝试了一些东西,似乎 xml 中的 HTML 格式有一些限制:

  • 标签必须小写

  • 这里提到的一些标签 不起作用,例如<br/>(可以\n改用)


阅读 63

收藏
2022-06-29

共1个答案

小编典典

以防万一有人发现这一点,还有一个没有记录的更好的替代方案(我在搜索了几个小时后绊倒了它,最后在 Android SDK 本身的错误列表中找到了它)。您可以在 _ strings.xml_ 中包含原始 HTML,只要将其包装在

<![CDATA[ ...raw html... ]]>

边缘案例:

  • 撇号 (‘)、双引号 (“) 和 & 号 (&) 等字符仅在您希望它们出现在呈现的文本 AS 中时才需要转义,但它们可以被合理地解释为 HTML。
    • 'and"可以表示为\'and \", or &apos;and &quot;.
    • <并且> 总是 需要转义&lt;&gt;如果你真的希望它们在文本中呈现为“<”和“>”。
    • 与号 (&) 有点复杂。
    • 与后跟空格的 & 符号呈现为 & 符号。
    • & 后跟一个或多个不构成有效 HTML 实体代码的字符呈现为 & 后跟这些字符。所以…&qqq;呈现为&qqq;,但&lt;1呈现为<1

例子:

<string name="nice_html">
<![CDATA[
<p>This is a html-formatted \"string\" with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph from the same \'string\'.</p>
<p>To be clear, 0 &lt; 1, & 10 &gt; 1<p>
]]>
</string>

然后,在您的代码中:

TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html), FROM_HTML_MODE_LEGACY));

恕我直言,使用起来要好几个数量级:-)


2021 年 8 月更新: 我的原始答案使用了 Html.fromHtml(String),它在 API 24
中已被弃用。建议使用替代的fromHtml(String,int)形式作为其替代。

FROM_HTML_MODE_LEGACY 可能会起作用......但其他标志之一可能是您想要做的更好的选择。

最后一点,如果您希望使用 Markdown 语法而不是 HTML 来呈现适合在 TextView 中使用的 Android Spanned
文本,现在有多个第三方库可以轻松实现,包括https://noties.io/Markwon

2022-06-29