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

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

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

  • 标签必须小写

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

原文由 slup 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

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

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

边缘案例:

  • 如果您希望撇号 (‘)、双引号 (“) 和与号 (&) 等字符本身出现在呈现的文本中,则只需要对它们进行转义,但它们可以合理地解释为 HTML。
    • ' and " can be represented as \' and \" , or &apos; and &quot;
    • < and > always need to be escaped as &lt; and &gt; if you literally want them to render as ‘<’ and ‘> ’ 在文中。
    • 符号 (&) 稍微复杂一些。
      • & 符号后跟空格呈现为 & 符号。
      • “&”后跟一个或多个不构成有效 HTML 实体代码的字符呈现为“&”后跟这些字符。 So… &qqq; renders as &qqq; , but &lt;1 renders as <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 跨区文本,现在有多个第三方库可以使它变得简单,包括 https://noties.io/Markwon

原文由 Bitbang3r 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于这里的最佳答案暗示有问题(或至少太复杂),我觉得应该更新这个问题,尽管这个问题很老了:

在 Android 中使用字符串资源时,您只需从 Java 代码调用 getString(...) 或在布局 XML 中使用 android:text="@string/..."

即使您想在字符串中使用 HTML 标记,也不必做太多更改:

您需要在 String 资源中转义的唯一字符是:

  • 双引号: " 变成 \"
  • 单引号: ' 变成 \'
  • 符号: & 变成 &#38;&amp;

这意味着您可以在 不转义标签的情况下添加 HTML 标记

 <string name="my_string"><b>Hello World!</b> This is an example.</string>

但是,可以肯定的是,您应该只使用 <b><i><u> ,因为它们在文档中列出。

如果您想使用 来自 XML 的 HTML 字符串,只需继续使用 android:text="@string/..." ,它将正常工作。

唯一的区别是,如果你想使用 Java 代码 中的 HTML 字符串,你必须使用 getText(...) 而不是 getString(...) 现在,因为前者保留样式而后者将把它剥下来。

就这么简单。没有 CDATA,没有 Html.fromHtml(...)

您只需要 Html.fromHtml(...) 如果您在 HTML 标记中对特殊字符 进行 编码。然后将它与 getString(...) 一起使用。如果您想将字符串传递给 String.format(...) ,这可能是必要的。

这些也都 在文档中进行了 描述。

编辑:

getText(...) 与未转义的 HTML(如我所建议的)或 CDATA 部分和 Html.fromHtml(...) 之间没有区别。

请参见下图进行比较:

在此处输入图像描述

原文由 caw 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题