我的 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... ]]>
'
和 "
可以表示为 \'
和 \"
,或者 '
和 "
。<
和 >
always 如果您真的希望它们在文本中呈现为“”,则需要将它们转义为 <
和 >
。&qqq;
呈现为 &qqq;
,但 <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 < 1, & 10 > 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/