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

我的 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 静态 View ,我宁愿保持这种状态,以免我创建 Activity 的开销。只是为了设置一些文本。

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

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

  • 标签必须小写

  • 提到的一些标签here不工作,例如<br/> (可以使用 \n 代替)

最佳答案

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

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

边缘案例:

  • 像撇号 (')、双引号 (") 和与号 (&) 这样的字符只有在您希望它们出现在呈现的文本 AS 中时才需要进行转义,但它们可以被合理地解释为 HTML。
    • '" 可以表示为 \'\" ,或者 &apos;&quot;
    • <> always 如果您真的希望它们在文本中呈现为“”,则需要将它们转义为 &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 .

https://stackoverflow.com/questions/3235131/

相关文章:

java - 如何在 Java 中打印带有 2 位小数的 float ?

windows - 在 Windows 批处理脚本中格式化日期和时间

c# - 格式化 XML 字符串以打印友好的 XML 字符串

android - 在Android中设置TextView span的颜色

python - 格式化没有尾随零的 float

python - 如何在 Python 中打破这条长线?

c# - 自定义数字格式字符串以始终显示符号

python - 如何自定义 Python 日志记录的时间格式?

java - 如何格式化带有前导零的Java字符串?

c# - 如何在 .NET 中使用自定义格式对 TimeSpan 对象进行 String.Forma