TextView 不支持所有的html标签,只有部分支持,复杂的需要webView来做
支持的标签有:
-
<a href="..."> 定义链接内容
-
<b>
定义粗体文字 b 是blod的缩写 -
<big>
定义大字体的文字 -
<blockquote>
引用块标签 -
<br>
定义换行 -
<cite>
表示引用的URI -
<dfn>
定义标签 dfn 是defining instance的缩写 -
<div align="...">
-
<em>
强调标签 em 是emphasis的缩写 -
<font size="..." color="..." face="...">
-
<h1>
-
<h2>
-
<h3>
-
<h4>
-
<h5>
-
<h6>
-
<i>
定义斜体文字 -
<img src="...">
-
<p>
段落标签,里面可以加入文字,列表,表格等 -
<small>
定义小字体的文字 -
<strike>
定义删除线样式的文字 不符合标准网页设计的理念,不赞成使用. strike是strikethrough的缩写 -
<strong>
重点强调标签 -
<sub>
下标标签 sub 是subscript的缩写 -
<sup>
上标标签 sup 是superscript的缩写 -
<tt>
定义monospaced字体的文字 不赞成使用. 此标签对中文没意义 tt是teletype or monospaced text style的意思 -
<u>
定义带有下划线的文字 u是underlined text style的意思
Android支持html 的两个接口
1 Spanned android.text.Html.fromHtml(String source)
输入的参数为(html格式的文本)
目前android不支持全部的html的标签,目前只支持与文本显示和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别
2 Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
Source: 需处理的html文本
imageGetter :对图片处理(处理html中的图片标签)
tagHandler :对标签进行处理(相当于自定义的标签处理,在这里面可以处理自定义的标签)
在第二个接口中,在实际应用中,需要处理html中的img为网络图片,同时也需要处理一些自定义的标签 如【视频】,下面我就说明这两块的概要实现
1 Spanned android.text.Html.fromHtml(String source)
输入的参数为(html格式的文本)
目前android不支持全部的html的标签,目前只支持与文本显示和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别
2 Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
Source: 需处理的html文本
imageGetter :对图片处理(处理html中的图片标签)
tagHandler :对标签进行处理(相当于自定义的标签处理,在这里面可以处理自定义的标签)
在第二个接口中,在实际应用中,需要处理html中的img为网络图片,同时也需要处理一些自定义的标签 如【视频】,下面我就说明这两块的概要实现
【1】 实现ImageGetter获取网络图片
ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable d=null;
try
{
URL aryURI = new URL(source);
/* 打开连接 */
URLConnection conn = aryURI.openConnection();
conn.connect();
/* 转变为 InputStream */
InputStream is = conn.getInputStream();
/* 将InputStream转变为Bitmap */
//Bitmap bm = BitmapFactory.decodeStream(is);
/* 关闭InputStream */
/*添加图片*/
d=Drawable.createFromStream(is, "111");
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
d.setBounds(1, 1, 45, 45);
return d;
}
注:public Drawable getDrawable(String source)
中Source 代表 <img> 标签中的图片路径
【2】 实现 自定义的TagHandler
实现的概要说明:
Step one 继承 TagHandler接口
Step Two 实现
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader)
接口被调用的过程:
系统在解析html文本
发现tag时调用一次 如<html>
接口传递的参数为 handleTag(true,”html”,output , xmlReader )
发现tag的闭合时,调用接口
接口传递的参数为 handleTag(false,”html”,output , xmlReader )
下面是一个实际执行的例子 给< strike> 标签 中的文字加上横线
实现的概要说明:
Step one 继承 TagHandler接口
Step Two 实现
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader)
接口被调用的过程:
系统在解析html文本
发现tag时调用一次 如<html>
接口传递的参数为 handleTag(true,”html”,output , xmlReader )
发现tag的闭合时,调用接口
接口传递的参数为 handleTag(false,”html”,output , xmlReader )
下面是一个实际执行的例子 给< strike> 标签 中的文字加上横线
public class MyHtmlTagHandler implements TagHandler {
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}
private void processStrike(boolean opening, Editable output) {
int len = output.length();
if(opening) {
output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, StrikethroughSpan.class);
int where = output.getSpanStart(obj);
output.removeSpan(obj);
if (where != len) {
output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
private Object getLast(Editable text, Class kind) {
Object[] objs = text.getSpans(0, text.length(), kind);
if (objs.length == 0) {
return null;
} else {
for(int i = objs.length;i>0;i--) {
if(text.getSpanFlags(objs[i-1]) == Spannable.SPAN_MARK_MARK) {
return objs[i-1];
}
}
return null;
}
}
}