在Android TextView上支持的HTML标签

5

我需要一份官方支持的Android TextView HTML标签列表。 我正在使用textView.setText(Html.fromHtml(label));但我不知道哪些标签被支持。


你可以在这里找到它:http://daniel-codes.blogspot.com/2011/04/html-in-textviews.html - Iatsenko Anton
请查看来自commansware的此链接:https://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html - Ichigo Kurosaki
1个回答

14

注意:

本文档适用于API 27,早期版本不保证支持此列表中出现的标签,而后续版本也可能会删除这些标签。请查看适用于相应API版本的等效类以获取适用的标签列表。


这些似乎没有任何文档记录(更正,2021年:不再是这种情况),也没有具体的标签添加列表(2021年:仍然如此)。我想 HTML 标签需要在某个地方声明 如果不在文档中,至少在代码中。幸运的是,Android 的 HTML 解析足够简单,可以轻松理解相关部分,而不必过多地搜索。

对于未来版本:您可以使用 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

这里需要特别注意的是支持的对齐变量。

  • center - 标准且易于理解的居中对齐
  • start - 左对齐
  • end - 右对齐

在RTL布局中,可能会颠倒start和end的位置 - 我没有测试过。


span和p, 以及 li 调用 startCssStyle, 这将使得可以访问以下style属性

text-decoration
background-color or background
color

"text-decoration 似乎仅限于 line-through。"

他们在后来的Android版本中肯定添加了更多功能。例如,<ul>对我来说很有效。 - Mark Herscher
1
@MarkHerscher 可能是在2017年之后的版本中添加的。我会看看是否能找到更新的列表(除非原始来源已经更新)。 - Zoe stands with Ukraine
1
更新了帖子。挖掘源代码以查找支持的标签和属性。 - Zoe stands with Ukraine
我在Google问题跟踪器上发现了一些请求信息的问题(两个,可能还有更多),但似乎没有被实现。至少可以在某个地方找到,所以我写了答案,以便将来的版本可以找到。希望我们最终能够从Google获得官方列表,而不需要挖掘代码。 - Zoe stands with Ukraine
1
https://developer.android.com/guide/topics/resources/string-resource.html#StylingWithHTML - drmrbrewer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接