我的 里面有一些固定的字符串strings.xml,例如:
strings.xml
<resources> <string name="somestring"> <B>Title</B><BR/> Content </string> </resources>
在我的布局中,我有一个TextView我想用 html 格式的字符串填充的内容。
TextView
<TextView android:id="@+id/formattedtext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/htmlstring"/>
如果我这样做,则内容formattedtext只是somestring剥离任何 html 标记的内容,因此未格式化。
formattedtext
somestring
我知道可以使用以下方式以编程方式设置格式化文本
.setText(Html.fromHtml(somestring));
因为我在程序的其他部分使用它,它按预期工作。
要调用此函数,我需要一个Activity,但目前我的布局只是纯 XML 中的一个简单的或多或少的静态视图,我宁愿保持这种状态,以免我创建一个Activity只是为了设置一些文本。
Activity
我是否忽略了一些明显的东西?根本不可能吗?欢迎任何帮助或解决方法!
编辑:刚刚尝试了一些东西,似乎 xml 中的 HTML 格式有一些限制:
标签必须小写
这里提到的一些标签 不起作用,例如<br/>(可以\n改用)
<br/>
\n
以防万一有人发现这一点,还有一个没有记录的更好的替代方案(我在搜索了几个小时后绊倒了它,最后在 Android SDK 本身的错误列表中找到了它)。您可以在 _ strings.xml_ 中包含原始 HTML,只要将其包装在
<![CDATA[ ...raw html... ]]>
'
"
\'
\"
'
"
<
>
<
>
&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。