Android TextView 上支持的 html 标签

Posted

技术标签:

【中文标题】Android TextView 上支持的 html 标签【英文标题】:Supported html tags on Android TextView 【发布时间】:2017-11-08 16:34:10 【问题描述】:

我需要 android TextView 上支持的 html 标记的正式列表。 我正在使用textView.setText(Html.fromHtml(label));,但我不知道支持哪些标签。

【问题讨论】:

你可以在这里找到它daniel-codes.blogspot.com/2011/04/html-in-textviews.html 检查来自commansware的this link 【参考方案1】:

注意:

这以 API 27 为目标。不保证早期版本支持此列表中显示的标签,以后的版本相同(它们可以被删除)。有关适用列表,请参阅适用 API 版本的等效类。


似乎这些都没有记录在任何地方(更正,2021:no longer the case),并且没有添加标签的具体列表(2021:似乎仍然如此)。我认为 HTML 标记需要在 somewhere 中声明,如果不在文档中,至少在代码中。幸运的是,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

其他方法涵盖支持的属性(在&lt;a href=""&gt; 中,href 是一个属性):


img:

src

font:

color
face

size 显然不受支持。


a:

href

p, ul, and div 调用startBlockElement,得到一个属性:

text-align

特别值得注意的是支持的对齐变量。

中心 - 标准且不言自明 开始 - 左对齐 end - 右对齐

开始和结束在 RTL 布局中可能会颠倒 - 我还没有测试过。


span and p 和li 调用startCssStyle,从而可以访问following style attributes:

text-decoration
background-color or background
color

text-decoration 似乎仅限于line-through

【讨论】:

他们肯定在以后的 Android 版本中添加了更多内容。例如, 对我有用。 @MarkHerscher 可能是在 2017 年之后的版本中添加的。我会看看是否能找到更新的列表(除非原始来源已更新) 更新了帖子。挖掘源代码以找到支持的标签和属性 干得好!我同意它没有记录在我能找到的任何地方,所以我故意含糊其辞。 developer.android.com/guide/topics/resources/…

以上是关于Android TextView 上支持的 html 标签的主要内容,如果未能解决你的问题,请参考以下文章

TextView

Android 支持展开收起的TextView

Android 支持展开收起的TextView

Android 支持展开收起的TextView

Android 支持展开收起的TextView

Android之文字点击链接