我需要一份官方支持的Android TextView HTML标签列表。
我正在使用textView.setText(Html.fromHtml(label));
但我不知道哪些标签被支持。
我需要一份官方支持的Android TextView HTML标签列表。
我正在使用textView.setText(Html.fromHtml(label));
但我不知道哪些标签被支持。
本文档适用于API 27,早期版本不保证支持此列表中出现的标签,而后续版本也可能会删除这些标签。请查看适用于相应API版本的等效类以获取适用的标签列表。
对于未来版本:您可以使用 IntelliJ 或其他 IDE 来探索 Html.java 的源代码,或者您始终可以访问 AOSP 网站或等效的 GitHub 存储库。使用 IDE 可能是最简单的选择。
Html#fromHtml(String, int)
调用 Html#fromHtml(String, Int, ImageGetter, TagHandler
方法。最后一个方法创建了一个 HtmlToSpannedConverter
,并返回转换的结果。我研究了那段代码,发现了 this method:
private void handleStartTag(String tag, Attributes attributes) {
if (tag.equalsIgnoreCase("br")) {
// We don't need to handle this. TagSoup will ensure that there's a </br> for each <br>
// so we can safely emit the linebreaks when we handle the close tag.
} else if (tag.equalsIgnoreCase("p")) {
startBlockElement(mSpannableStringBuilder, attributes, getMarginParagraph());
startCssStyle(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("ul")) {
startBlockElement(mSpannableStringBuilder, attributes, getMarginList());
} else if (tag.equalsIgnoreCase("li")) {
startLi(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("div")) {
startBlockElement(mSpannableStringBuilder, attributes, getMarginDiv());
} else if (tag.equalsIgnoreCase("span")) {
startCssStyle(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("strong")) {
start(mSpannableStringBuilder, new Bold());
} else if (tag.equalsIgnoreCase("b")) {
start(mSpannableStringBuilder, new Bold());
} else if (tag.equalsIgnoreCase("em")) {
start(mSpannableStringBuilder, new Italic());
} else if (tag.equalsIgnoreCase("cite")) {
start(mSpannableStringBuilder, new Italic());
} else if (tag.equalsIgnoreCase("dfn")) {
start(mSpannableStringBuilder, new Italic());
} else if (tag.equalsIgnoreCase("i")) {
start(mSpannableStringBuilder, new Italic());
} else if (tag.equalsIgnoreCase("big")) {
start(mSpannableStringBuilder, new Big());
} else if (tag.equalsIgnoreCase("small")) {
start(mSpannableStringBuilder, new Small());
} else if (tag.equalsIgnoreCase("font")) {
startFont(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("blockquote")) {
startBlockquote(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("tt")) {
start(mSpannableStringBuilder, new Monospace());
} else if (tag.equalsIgnoreCase("a")) {
startA(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("u")) {
start(mSpannableStringBuilder, new Underline());
} else if (tag.equalsIgnoreCase("del")) {
start(mSpannableStringBuilder, new Strikethrough());
} else if (tag.equalsIgnoreCase("s")) {
start(mSpannableStringBuilder, new Strikethrough());
} else if (tag.equalsIgnoreCase("strike")) {
start(mSpannableStringBuilder, new Strikethrough());
} else if (tag.equalsIgnoreCase("sup")) {
start(mSpannableStringBuilder, new Super());
} else if (tag.equalsIgnoreCase("sub")) {
start(mSpannableStringBuilder, new Sub());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
startHeading(mSpannableStringBuilder, attributes, tag.charAt(1) - '1');
} else if (tag.equalsIgnoreCase("img")) {
startImg(mSpannableStringBuilder, attributes, mImageGetter);
} else if (mTagHandler != null) {
mTagHandler.handleTag(true, tag, mSpannableStringBuilder, mReader);
}
}
这个列表包含了所有支持的HTML标签。这个列表可能会在后续版本中发生变化(跟我最初回答的不同),但你可以自己去查看后续版本的源代码来找到它。使用以上代码,这是当前受支持的列表:
br
p
ul
li
div
span
strong
b
em
cite
dfn
i
big
small
font
blockquote
tt
a
u
del
s
strike
sub
sup
img
h1
h2
h3
h4
h5
h6
更进一步的方法涵盖了支持的属性(在<a href="">
中,href
是一个属性):
img:
src
font:
color
face
size
显然不受支持。
a:
href
p,ul和div调用startBlockElement,它提供了一个属性:
text-align
这里需要特别注意的是支持的对齐变量。
在RTL布局中,可能会颠倒start和end的位置 - 我没有测试过。
span和p, 以及 li 调用 startCssStyle, 这将使得可以访问以下style
属性:
text-decoration
background-color or background
color
text-decoration
似乎仅限于 line-through
。"