android textview 显示html方法解析

现在网络的繁盛时代,光文字是不能满足人们的胃口的,图片,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());

}

}

下篇将会讲带图片的html文本显示!待续 。。。。。

时间: 2024-08-01 21:07:40

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

android textview 显示html方法解析_Android

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

Android TextView显示Html类解析的网页和图片及自定义标签用法示例_Android

本文实例讲述了Android TextView显示Html类解析的网页和图片及自定义标签.分享给大家供大家参考,具体如下: Android系统显示HTML网页的最佳控件为WebView,有时候为了满足特定需求,需要在TextView中显示HTML网页.图片及解析自定义标签. 1.TextView显示Html类解析的网页 CharSequence richText = Html.fromHtml("<strong>萝卜白菜的博客</strong>--<a href='

Android TextView显示html样式的文字_Android

先给大家说下项目需求: TextView显示一段文字,格式为:白雪公主(姓名,字数不确定)向您发来了2(消息个数,不确定)条消息 这段文字中名字和数字的长度是不确定的,还要求名字和数字各自有各自的颜色. 就想到了用 Html.fromHtml(String str)来实现. 看方法名很简单,就是可以显示字符串str对应的html格式的文本 比如: Html.fromHtml(<font color='red' size='24'>你好</font>" ) 就将你好以htm

android xml-android中用什么方法解析xml文件速度快?

问题描述 android中用什么方法解析xml文件速度快? 要解析本地大一点的xml文件,用什么方法速度快?希望大神能说详细点,感激不尽,,,,,,, 解决方案 对于内存资源非常宝贵的移动设备,在解析XMl文件时最好是使用PULL解析,这种解析方式是事件驱动的,可以中途停止的,不至于将整个文件全部加载到内存中. 解决方案二: 有多大?几十m?几百m?

Android TextView显示文字过长时添加阴影渐变消失效果

TextView 上显示的文字超过其最长限制的时候,要如何实现以下效果:   values/styles.xml  <style name="AudioFileInfoOverlayText"> <item name="android:paddingLeft">4px</item> <item name="android:paddingBottom">4px</item> <ite

android实现图片验证码方法解析(自绘控件)

自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 1.使用TypedArray初始化属性集合     在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件属性信息的 我们也的确可以通过循环然后用键值对的方式获取信息 而TypedArray是用来简化我们的工作的 2.重写onMeasure 测量控件大小 3.重写onDraw 绘制控件 2.根据需求在attrs文件中自定义属性 declare-styleable 声明自定义属性可以自定义一个

Android ijkplayer的使用方法解析

ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器,支持播放本地网络视频,也支持流媒体播放.支持Android&iOS. ijkplayer的编译这里不多阐述,我也是直接获取别人编译完成的so库文件,直接使用的.如果你对ijkplayer的编译感兴趣,可以百度一下,有很多文章. 使用ijkplayer 导包 ijkplayer源码官方下载地址:https://github.com/Bilibili/ijkplayer 上面是官方提供的ijkplayer的源码地址,但

Android中TextView显示插入的图片实现方法_Android

本文实例讲述了Android中TextView显示插入的图片实现方法.分享给大家供大家参考,具体如下: Android系统默认给TextView插入图片提供了三种方式: 1.ImageSpan 2.Html.ImageGetter 3.TextView.setCompoundDrawables(left, top, right, bottom) 1.TextView使用ImageSpan显示图片 ImageSpan span = new ImageSpan(this, R.drawable.ic

java-Android textView 中 onCreate 方法的改变

问题描述 Android textView 中 onCreate 方法的改变 我在main.xml上使用 Layout Editor创建了一个textview名称是textView1. 我想使用一个自定义的字体,所以我在onCreate方法中创建了下面的代码,但是好像不能识别textView1. package com.mystraldesign.memorable; import android.app.Activity; import android.graphics.Typeface; i