现在网络的繁盛时代,光文字是不能满足人们的胃口的,图片,flash,音频,视频就成为浏览网页的主流显示,在手机上也一样。在手机上显示从网络端获取的数据显示,大家很自然的想起两种方式,一种就是webview,一种就是TextView。当然webView直接显示html页面就行了,我主要说的TextView显示html内容。 
首先,说下TextView到底支持那些标签呢,通过对源码的查看,发现Textview可以解析一部分html标签,如:

复制代码代码如下:
<a href="..."> 
<b> 
<big> 
<blockquote> 
<br> 
<cite> 
<dfn> 
<div align="..."> 
<em> 
<font size="..." color="..." face="..."> 
<h1> 
<h2> 
<h3> 
<h4> 
<h5> 
<h6> 
<i> 
<img src="..."> 
<p> 
<small> 
<strike> 
<strong> 
<sub> 
<sup> 
<tt> 
<u> 

大家想究其根本可以查看android.text.Html源码,其中有一段这样写:

复制代码代码如下:
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 emite the linebreaks when we handle the close tag. 
} else if (tag.equalsIgnoreCase("p")) { 
handleP(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("div")) { 
handleP(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("em")) { 
start(mSpannableStringBuilder, new Bold()); 
} else if (tag.equalsIgnoreCase("b")) { 
start(mSpannableStringBuilder, new Bold()); 
} else if (tag.equalsIgnoreCase("strong")) { 
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")) { 
handleP(mSpannableStringBuilder); 
start(mSpannableStringBuilder, new Blockquote()); 
} 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("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') { 
handleP(mSpannableStringBuilder); 
start(mSpannableStringBuilder, new Header(tag.charAt(1) - '1')); 
} else if (tag.equalsIgnoreCase("img")) { 
startImg(mSpannableStringBuilder, attributes, mImageGetter); 
} else if (mTagHandler != null) { 
mTagHandler.handleTag(true, tag, mSpannableStringBuilder, mReader); 


private void handleEndTag(String tag) { 
if (tag.equalsIgnoreCase("br")) { 
handleBr(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("p")) { 
handleP(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("div")) { 
handleP(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("em")) { 
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD)); 
} else if (tag.equalsIgnoreCase("b")) { 
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD)); 
} else if (tag.equalsIgnoreCase("strong")) { 
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC)); 
} else if (tag.equalsIgnoreCase("cite")) { 
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC)); 
} else if (tag.equalsIgnoreCase("dfn")) { 
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC)); 
} else if (tag.equalsIgnoreCase("i")) { 
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC)); 
} else if (tag.equalsIgnoreCase("big")) { 
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f)); 
} else if (tag.equalsIgnoreCase("small")) { 
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f)); 
} else if (tag.equalsIgnoreCase("font")) { 
endFont(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("blockquote")) { 
handleP(mSpannableStringBuilder); 
end(mSpannableStringBuilder, Blockquote.class, new QuoteSpan()); 
} else if (tag.equalsIgnoreCase("tt")) { 
end(mSpannableStringBuilder, Monospace.class, 
new TypefaceSpan("monospace")); 
} else if (tag.equalsIgnoreCase("a")) { 
endA(mSpannableStringBuilder); 
} else if (tag.equalsIgnoreCase("u")) { 
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan()); 
} else if (tag.equalsIgnoreCase("sup")) { 
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan()); 
} else if (tag.equalsIgnoreCase("sub")) { 
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan()); 
} else if (tag.length() == 2 && 
Character.toLowerCase(tag.charAt(0)) == 'h' && 
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') { 
handleP(mSpannableStringBuilder); 
endHeader(mSpannableStringBuilder); 
} else if (mTagHandler != null) { 
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader); 

通过源码可以看到,除了默认的一些标签,其还支持自定义标签;看下面代码: 
else if (mTagHandler != null) { 
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader); 

系统会调用mTagHandler的handleTag方法。所以,我们可以实现此接口,来解析自己定义的标签类型。 
具体的,自己可以看一下下面实例:

复制代码代码如下:
package com.mxgsa.tvimg; 
import org.xml.sax.XMLReader; 
import android.content.Context; 
import android.content.Intent; 
import android.text.Editable; 
import android.text.Html.TagHandler; 
import android.text.Spanned; 
import android.text.style.ClickableSpan; 
import android.view.View; 
import android.view.View.OnClickListener; 
public class MxgsaTagHandler implements TagHandler{ 
private int sIndex = 0; 
private int eIndex=0; 
private final Context mContext; 
public MxgsaTagHandler(Context context){ 
mContext=context; 

public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { 
// TODO Auto-generated method stub 
if (tag.toLowerCase().equals("mxgsa")) { 
if (opening) { 
sIndex=output.length(); 
}else { 
eIndex=output.length(); 
output.setSpan(new MxgsaSpan(), sIndex, eIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 



private class MxgsaSpan extends ClickableSpan implements OnClickListener{ 
@Override 
public void onClick(View widget) { 
// TODO Auto-generated method stub 
//具体代码,可以是跳转页面,可以是弹出对话框,下面是跳转页面 
mContext.startActivity(new Intent(mContext,MainActivity.class)); 


调用页面:

复制代码代码如下:
package com.mxgsa.tvimg; 
import android.app.Activity; 
import android.os.Bundle; 
import android.text.Html; 
import android.text.method.LinkMovementMethod; 
import android.widget.TextView; 
public class MxgsaActivity extends Activity{ 
private TextView tView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.mxgsa_activity); 
findControl(); 
setData(); 

private void findControl() { 
tView = (TextView) findViewById(R.id.tvImage); 

private void setData() { 
// TODO Auto-generated method stub 
final String sText = "测试自定义标签:<br><h1><mxgsa>测试自定义标签</mxgsa></h1>"; 
tView.setText(Html.fromHtml(sText, null, new MxgsaTagHandler(this))); 
tView.setClickable(true); 
tView.setMovementMethod(LinkMovementMethod.getInstance()); 

textview 显示html方法解析的更多相关文章

  1. 我的Android进阶之旅------&amp;gt; Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...

  2. Android中用TextView显示大量文字的方法

    最近学习Android中,试着实现一个简单的显示新闻Demo的时候,遇到了一个问题:一条新闻的内容文字很多,放在TextView上面超出屏幕了,怎么破? 查了一下资料,找到了两种方法实现: 1. 只用 ...

  3. TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)

    很久以前做的表情输入及显示,用的系统的SpannableString,完成后的代码在其他版本的Android手机上没有问题,但是在在4.1和4.1.1的手机上显示时,有概率出现程序崩溃的问题. 下面是 ...

  4. Python的方法解析顺序(MRO)[转]

    本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...

  5. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  6. Android项目实战(十四):TextView显示html样式的文字

    项目需求: TextView显示一段文字,格式为:(消息个数,不确定)条消息 这段文字中名字和数字的长度是不确定的,还要求名字和数字各自有各自的颜色. 一开始我想的是用(转) SpannableStr ...

  7. Android设置TextView显示一行或多行

    在listView的item中或者是特殊的业务需求中,会要求TextView的内容不完全显示,只有通过一个指定的操作后才显示所有的,比如说一个按钮或者是其它的什么控件. 要想实现这个效果并不难,只要控 ...

  8. TextView显示内容不全

    今天开发遇到一个问题,发现TextView显示不全,很纳闷,看图: 正常情况应该是这个样子的: 造成这种情况的原因是: TextView被快速并且多次的设置内容值造成的. 我的场景: 我点击全选按钮, ...

  9. TextView显示HTML文本时&lt;IMG&gt;标签指定图片的显示处理

    TextView显示文本时是支持一些HTML标签的(具体支持那些标签会在下面附录列出),不会需要先用HTML的static方法fromHtml来转换一下. Spanned text = Html.fr ...

随机推荐

  1. FTP的20、21端口,工作模式

    什么是FTP? FTP就是文件传输协议 File Transfer Protocol 的缩写. FTP端口号是多少? 21 FTP的端口号能改吗? 能 ftp的端口号20.21有何区别? 一个是数据端 ...

  2. oracle 游标示例

    declare iCount int:=0; sPath nvarchar2(200); tdzsh nvarchar2(50);begin for x in (select c.imgpath fr ...

  3. Linux下用arptables防arp攻击

    Linux下网络层防火墙iptables很强大,链路层也有类似的防火墙arptables,可针对arp地址进行限制,防止ARP网关欺骗攻击,再配合静态绑定MAC和向网关报告正确的本机MAC地址,有效解 ...

  4. nmon的安装以及使用

    在做性能的时候都需要监控服务器的各项资源,这里使用的是nmon,小巧,而且比较好用,记录安装过程 在linux下创建nmon目录 方便放文件 mkdir /usr/local/nmon cd /usr ...

  5. UTF-8/UTF-16/UTF-32

    UTF-8/UTF-16/UTF-32 一.UTF-8/UTF-16/UTF-32三者的区别 二.BOM的检测与删除 1.用VIM去除<feff>,即 U+FEFF.注意:这是一个字符,而 ...

  6. display_errors &amp; error_reporting(php调试安全)

    这两个选项对应的值即都可以在php.ini文件中设置,也都可以在php代码中使用相应的函数来设置. 在php.ini文件中的设置如下:

  7. iOS 性能测试 - FBMemoryProfiler

    FBMemoryProfiler 是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库. 脑补:http://www.cocoachina.com/ios/20160421/159 ...

  8. 双卡双待支持双电池 夏新N808深度评测_夏新手机评测-泡泡网

    双卡双待支持双电池 夏新N808深度评测_夏新手机评测-泡泡网 双卡双待支持双电池 夏新N808深度评测

  9. Swift - 滑块(UISlider)的用法

    1,滑块的创建 1 2 3 4 5 6 var slider=UISlider(frame:CGRectMake(0,0,300,50)) slider.center=self.view.center ...

  10. Hibernate配置XML连接数据库

    一.hibernate.cfg.xml 1.配置连接Oracle <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate ...