如今網絡的繁盛時代,光文字是不能知足人們的胃口的,圖片,flash,音頻,視頻就成爲瀏覽網頁的主流顯示,在手機上也同樣。在手機上顯示從網絡端獲取的數據顯示,你們很天然的想起兩種方式,一種就是webview,一種就是TextView。固然webView直接顯示html頁面就好了,我主要說的TextView顯示html內容。 html
首先,說下TextView到底支持那些標籤呢,經過對源碼的查看,發現Textview能夠解析一部分html標籤,如: android
<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源碼,其中有一段這樣寫: web
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);
}
}
經過源碼能夠看到,除了默認的一些標籤,其還支持自定義標籤;看下面代碼: vim
else
if (mTagHandler !=
null) {
mTagHandler.handleTag(
false, tag, mSpannableStringBuilder, mReader);
}
系統會調用mTagHandler的handleTag方法。因此,咱們能夠實現此接口,來解析本身定義的標籤類型。 網絡
具體的,本身能夠看一下下面實例: app
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));
}
}
}
調用頁面: ide
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());
}
}