Android使用TextView加载Html都支持哪些标签和样式

支持的标签

Android 原生的 TextView 控件通过 Html.fromHtml() 方法可以加载 HTML 内容,并自动将其转换为Spannable 对象以支持富文本样式和链接等功能。在加载 HTML 内容时,TextView支持的 HTML 标签和样式主要有以下几种:

标题标签

TextView 可以解析 HTML 中的标题标签,包括 <h1><h2><h3><h4><h5><h6>,并自动转换为对应的样式。

例如:

1
myTextView.setText(Html.fromHtml("<h1>这是一级标题</h1><h2>这是二级标题</h2>"));

文本格式标签

TextView 支持的文本格式标签有 <b>(加粗)、<i>(斜体)、<u>(下划线)和 <strike>(删除线)等。在加载HTML 时,这些标签会自动被转换为相应的 Spannable 对象,并应用到对应的文字上。

例如:

1
myTextView.setText(Html.fromHtml("<b>这段文字加粗</b>,<i>这段文字斜体</i>,<u>这段文字加下划线</u>,<strike>这段文字带删除线</strike>"));

列表标签

TextView 支持的列表标签有无序列表 <ul> 和有序列表 <ol>,并会自动转换为相应的 Spannable 对象。

例如:

1
myTextView.setText(Html.fromHtml("<ul><li>这是无序列表的第一项</li><li>这是无序列表的第二项</li></ul><ol><li>这是有序列表的第一项</li><li>这是有序列表的第二项</li></ol>"));

链接标签

TextView 支持的链接标签有 <a>,在加载 HTML时会自动将其转换为 LinkSpan 对象,并允许用户点击跳转到对应的URL 地址。同时,在跳转时,也支持使用自定义的 Callback回调函数进行处理。

例如:

1
2
myTextView.setText(Html.fromHtml("请点击这个 <a href=\"http://www.baidu.com\">链接</a>"));
myTextView.setMovementMethod(LinkMovementMethod.getInstance());

除了默认的点击行为之外,我们还可以使用自定义的 URLSpanClickableSpan 类来处理连接的点击事件,例如弹出一个对话框或者打开一个新的 Activity 等。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MyLinkMovementMethod extends LinkMovementMethod {
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();

if (action == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();

x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();

x += widget.getScrollX();
y += widget.getScrollY();

Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);

URLSpan[] urls = buffer.getSpans(off, off, URLSpan.class);
ClickableSpan[] cs = buffer.getSpans(off, off, ClickableSpan.class);

if (urls.length != 0) {
urls[0].onClick(widget);
return true;
} else if (cs.length != 0) {
cs[0].onClick(widget);
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
}

上面的代码继承了 LinkMovementMethod 类,并重写了 onTouchEvent 方法,用于处理链接的点击事件。具体来说,当用户点击链接时,首先会判断该链接是否是一个 URLSpan 或者 ClickableSpan 对象,如果是,则调用其相应的 onClick() 方法实现自定义的行为。否则,将返回 false 继续使用默认的点击行为。

使用自定义的 MyLinkMovementMethod 可以通过以下方式设置给 TextView:

1
myTextView.setMovementMethod(new MyLinkMovementMethod());

这样,就可以在用户点击链接时实现自定义的行为了。需要注意的是,实现过程中需要根据具体的需求自己进行相应的代码编写,例如在 onClick() 方法中弹出对话框或启动新的Activity 等。

除此之外还可以使用自定义的 ClickableSpan 对象来实现不同链接的事件处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MyClickableSpan extends ClickableSpan {
private String mHref;

public MyClickableSpan(String href) {
mHref = href;
}

@Override
public void onClick(View widget) {
Context context = widget.getContext();

if (mHref.startsWith("myapp://activity_a")) {
Intent intent = new Intent(context, ActivityA.class);
context.startActivity(intent);
} else if (mHref.startsWith("myapp://activity_b")) {
Intent intent = new Intent(context, ActivityB.class);
context.startActivity(intent);
}
}
}

// 使用方式
String html = "<a href=\"myapp://activity_a\">Activity A</a>" +
"<a href=\"myapp://activity_b\">Activity B</a>";

TextView textView = findViewById(R.id.text_view);
textView.setText(Html.fromHtml(html));
textView.setMovementMethod(LinkMovementMethod.getInstance());
SpannableString text = (SpannableString) textView.getText();
MyClickableSpan[] links = text.getSpans(0, text.length(), MyClickableSpan.class);
for (MyClickableSpan span : links) {
int start = text.getSpanStart(span);
int end = text.getSpanEnd(span);
text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

图片标签

TextView 支持的图片标签有 <img>,在加载 HTML 时会自动将其转换为 ImageSpan 对象,并将图片显示在对应的位置上。

例如:

1
myTextView.setText(Html.fromHtml("<img src=\"https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png\"/>"));

上面所列举的标签和样式只是 TextView支持的一部分,实际上还有很多其它的标签和样式可以通过 Html.fromHtml() 方法解析并显示出来。但需要注意的是,由于安全性考虑,Android 在解析 HTML 内容时禁止加载 JavaScript、CSS 等内容,因此在使用时需要注意避免加载不安全的 HTML 内容。

支持的样式

Android原生TextView 中,通过 Html.fromHtml() 方法加载 HTML标记时,是可以支持部分 CSS样式的。下面是一些常见的 CSS 样式以及它们在 Android原生 TextView 中的表现效果:

  1. 字体大小:font-size

    可以使用 font-size 属性来设置字体大小,例如:

    1
    <p style="font-size: 20px;">这是一个字体大小为 20px 的段落。</p>
  2. 颜色:color

    可以使用 color 属性来设置字体颜色,例如:

    1
    <p style="color: red;">这是一个红色的段落。</p>
  3. 字体粗细:font-weight

    可以使用 font-weight 属性来设置字体粗细,例如:

    1
    <p style="font-weight: bold;">这是一个粗体的段落。</p>
  4. 文本对齐:text-align

    可以使用 text-align 属性来设置文本对齐方式,例如:

    1
    <p style="text-align: center;">这是一个居中对齐的段落。</p>
  5. 背景颜色:background-color

    可以使用 background-color 属性来设置背景颜色,例如:

    1
    <p style="background-color: yellow;">这是一个黄色背景的段落。</p>
  6. 下划线:text-decoration

    可以使用 text-decoration 属性来设置下划线,例如:

    1
    <p style="text-decoration: underline;">这是一个带下划线的段落。</p>

需要注意的是,并不是所有的 CSS 样式都会被 Android 原生 TextView 支持。同时,在 HTML 标记中使用样式时,需要使用行内样式属性(如上面的示例代码所示),而不能使用外部样式表。如果需要添加进一步的样式,可以考虑使用 SpannableString 或自定义View来进行实现。

本文内容来自 : ChatGPT

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%