android只Textiew显示Html文本

复制代码

大家想究其根本可以查看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  for each 
             //  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;
//blog.youkuaiyun.com/linghu_java/article/details/8307665 “复制代码”)

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值