在 Android 个 TextView 上支持 html 个标签
Supported html tags on Android TextView
我需要 Android TextView 上支持的 HTML 标签的官方列表。
我正在使用 textView.setText(Html.fromHtml(label));
,但我不知道支持哪些标签。
注:
此目标 API 27. 不保证早期版本支持此列表中看到的标签,以后的版本也一样(它们可以被删除)。请参阅适用列表的适用 API 版本的等效 class。
似乎这些都没有在任何地方记录(更正,2021 年:no longer the case),并且没有关于何时添加标签的具体列表(2021 年:情况似乎仍然如此)。我认为 HTML 标签需要在 某处 声明,如果不在文档中,至少在代码中。幸运的是,Android 的 HTML 解析足够直接,无需过多翻阅垃圾箱即可轻松理解相关位。
对于未来的版本:您可以使用 IntelliJ 或其他一些 IDE 来探索 Html.java 的源代码,或者您可以随时访问 AOSP 站点或等效站点 GitHub 存储库。使用 IDE 可能是最简单的选择。
Html#fromHtml(String, int)
呼叫 Html#fromHtml(String, Int, ImageGetter, TagHandler
。最后一个方法创建一个HtmlToSpannedConverter
和returns转换的结果。我深入研究了该代码,发现 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, and div calls startBlockElement,给出一个属性:
text-align
值得注意的一点是支持的对齐变量。
- 中心 - 标准且一目了然
- 开始 - 左对齐
- 结束 - 右对齐
开始和结束在 RTL 布局中可能会颠倒 - 我还没有测试过。
span and p, and li calls startCssStyle, which gives access to the following style
attributes:
text-decoration
background-color or background
color
text-decoration
好像仅限于line-through
.
我需要 Android TextView 上支持的 HTML 标签的官方列表。
我正在使用 textView.setText(Html.fromHtml(label));
,但我不知道支持哪些标签。
注:
此目标 API 27. 不保证早期版本支持此列表中看到的标签,以后的版本也一样(它们可以被删除)。请参阅适用列表的适用 API 版本的等效 class。
似乎这些都没有在任何地方记录(更正,2021 年:no longer the case),并且没有关于何时添加标签的具体列表(2021 年:情况似乎仍然如此)。我认为 HTML 标签需要在 某处 声明,如果不在文档中,至少在代码中。幸运的是,Android 的 HTML 解析足够直接,无需过多翻阅垃圾箱即可轻松理解相关位。
对于未来的版本:您可以使用 IntelliJ 或其他一些 IDE 来探索 Html.java 的源代码,或者您可以随时访问 AOSP 站点或等效站点 GitHub 存储库。使用 IDE 可能是最简单的选择。
Html#fromHtml(String, int)
呼叫 Html#fromHtml(String, Int, ImageGetter, TagHandler
。最后一个方法创建一个HtmlToSpannedConverter
和returns转换的结果。我深入研究了该代码,发现 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, and div calls startBlockElement,给出一个属性:
text-align
值得注意的一点是支持的对齐变量。
- 中心 - 标准且一目了然
- 开始 - 左对齐
- 结束 - 右对齐
开始和结束在 RTL 布局中可能会颠倒 - 我还没有测试过。
span and p, and li calls startCssStyle, which gives access to the following style
attributes:
text-decoration
background-color or background
color
text-decoration
好像仅限于line-through
.