我有带有 ul 和 li 的字符串。我正在尝试在 textview 中以 HTML 格式显示它们。textView.setText(Html.fromHtml(myHtmlText));
但是 textview 显示纯文本。如何在 textview 中格式化 ul 和 li 标签?
7 回答
您可以使用 Html.TagHandler。
在您的情况下,它将是这样的:
public class UlTagHandler implements Html.TagHandler{
@Override
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equals("ul") && !opening) output.append("\n");
if(tag.equals("li") && opening) output.append("\n\t•");
}
}
和
textView.setText(Html.fromHtml(myHtmlText, null, new UlTagHandler()));
字符串资源中支持的标签
静态字符串资源中的标签由 android.content.res.StringBlock 解析,这是一个隐藏类。我查看了该类并确定了支持哪些标签:
<a> (supports attributes "href")
<annotation>
<b>
<big>
<font> (supports attributes "height", "size", "fgcolor" and "bicolor", as integers)
<i>
<li>
<marquee>
<small>
<strike>
<sub>
<sup>
<tt>
<u>
Html.fromHtml() 支持的标签
出于某种原因, Html.fromHtml() 处理一组不同于静态文本支持的标记。这是标签列表(从 Html.java 的源代码中收集):
<a> (supports attribute "href")
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div>
<em>
<font> (supports attributes "color" and "face")
<i>
<img> (supports attribute "src". Note: you have to include an ImageGetter to handle retrieving a Drawable for this tag)
<p>
<small>
<strong>
<sub>
<sup>
<tt>
<u>
有关更多详细信息,请参阅此链接
请参阅TextView 支持的 HTML 标记 ul和li标记均不受android.text.Html类的支持。
解决方案:您可以使用WebView或TagHandler显示这些标签
如需更多帮助,请参阅此帖子:
根据下面的答案,您不能在这里使用每个 HTML 标签;
https://stackoverflow.com/a/3150456/2275962
但是,可以肯定的是,有一种方法可以在 Android TextView 中显示项目符号。您可以将<li>
标签替换为•
(项目符号的 HTML 代码)。
如果您想尝试其他列表图标,请使用表中首选的一个是此链接;
使 API 级别 M (23) 及更低级别的工作的一种非常简单的方法从您的 HTML 字符串中,您可以使用以下内容:
private fun String.formattedHtml(): String {
// Work around for API Versions lower than N, Html.fromHtml does not render list items correctly
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
this.replace("<ul>", "")
.replace("</ul>", "")
.replace("<li>", "<p>• ")
.replace("</li>", "</p>")
} else {
this
}
}
然后,您可以使用:
Html.fromHtml("<ul><li> test </li></ul>".formattedHtml())
不需要TagHandler
API N 及更高版本,如https://stackoverflow.com/a/40524835中所述,android.text.Html
支持li
和ul
标记。
我的情况是我的数据来自 API 调用。我仍然需要输出来匹配我的应用程序的格式,所以我将 HTML 字符串包装在格式化标签中以显示在我的 WebView 中:
public static String formatHtmlString(String stringIn) {
String format = "<html>"
+ " <head>"
+ " <style type='text/css'>"
+ " body { "
+ " font-family: \"HelveticaNeue-Light\", \"Helvetica Neue Light\"; "
+ " font-size:14px;" + " color:#000;"
+ " }" + " b { " + " font-size:14px;"
+ " }" + " i { " + " font-size:10px;"
+ " color:#333333;" + " opacity:0.75;"
+ " }" + " </style>" + " </head>" + " <body>"
+ stringIn + "</body>" + "</html>";
return format;
}
在我的情况下,我得到一个字符串列表(从后端作为 JSON 响应),然后使用这种方法手动渲染 HTML TextView
:
在科特林
// ViewUtils.kt
@file:JvmName("ViewUtils")
package com.company
private fun List<String>.joinToBulletList(): String =
joinToString(prefix = "<ul>", postfix = "</ul>", separator = "\n") {
"<li> $it</li>"
}
fun TextView.renderToHtmlWithBulletList(contents: List<String>) {
val content = contents.joinToBulletList()
val html: Spannable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT, null, null) as Spannable
} else {
Html.fromHtml(content, null, null) as Spannable
}
text = html
}
// AnyActivity.kt
val contents = listOf("desc 1", "desc 2", "desc 3")
textViewFromXml.renderToHtmlWithBulletList(contents)
在 Java 中
// AnyActivity.java
List<String> contents = new String["desc 1", "desc 2", "desc 3"];
ViewUtils.renderToHtmlWithBulletList(textViewFromXml, contents)
请注意@file:JvmName("ViewUtils")
,更改文件名很有用,以便 Java 代码可以调用它ViewUtils.java
而不是ViewUtilsKt.java
. 请参阅此处了解更多详细信息
PS:请随意编辑