亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android textview 顯示html方法解析

2020-04-11 12:42:18
字體:
來源:轉載
供稿:網友
現在網絡的繁盛時代,光文字是不能滿足人們的胃口的,圖片,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文本顯示!待續 。。。。。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品一偷一偷国产| 久久99亚洲精品| 欧美日韩性视频在线| 91精品国产91久久久| 91网站免费看| 亚洲欧洲av一区二区| 国产综合福利在线| 欧美劲爆第一页| 一本色道久久88综合日韩精品| 国产亚洲一区二区精品| 伊人伊成久久人综合网站| 成人高清视频观看www| 国产精品激情av在线播放| 正在播放欧美一区| 精品国产一区二区三区久久| 九九久久久久久久久激情| 国产精品人成电影在线观看| 欧美日韩激情视频8区| 日韩电影在线观看免费| 夜夜嗨av一区二区三区免费区| 91精品免费久久久久久久久| 亚洲尤物视频网| 91av在线国产| 久久久中文字幕| 欧美色videos| 97激碰免费视频| www.久久草.com| 国产+成+人+亚洲欧洲| 欧美极品在线视频| 久久99亚洲热视| 日韩av不卡在线| 日韩在线高清视频| 精品久久国产精品| 成人精品视频99在线观看免费| 亚洲国产精品va在线看黑人| 最新国产成人av网站网址麻豆| 日本亚洲欧洲色α| 欲色天天网综合久久| 大伊人狠狠躁夜夜躁av一区| 91av视频在线免费观看| 日韩在线免费高清视频| 久久久久久久一区二区| 大胆人体色综合| 国产精品久久91| 日本成人激情视频| 亚洲天堂免费在线| 中日韩午夜理伦电影免费| 成人福利在线观看| 日韩动漫免费观看电视剧高清| 神马国产精品影院av| 日韩在线免费视频观看| 日韩电影中文字幕在线| 欧美黑人巨大xxx极品| 国产一区二区三区视频在线观看| 96国产粉嫩美女| 精品国产一区二区三区久久狼5月| 亚洲a级在线观看| 精品在线观看国产| 亚洲高清一二三区| 91精品视频在线看| 欧美电影电视剧在线观看| 日韩一级黄色av| 黄色一区二区在线| 91精品国产亚洲| 亚洲黄页网在线观看| 亚洲人成亚洲人成在线观看| 一区二区三欧美| 欧美日韩成人黄色| 在线成人激情视频| 中文在线资源观看视频网站免费不卡| 91chinesevideo永久地址| 日本久久久久久久久久久| 欧美床上激情在线观看| www.日本久久久久com.| 日韩欧美亚洲国产一区| 日韩av最新在线观看| 国产精品一区二区三区毛片淫片| 国产成人精品一区二区三区| 国产在线日韩在线| 亚洲成年人影院在线| 国产精品看片资源| 欧美日韩一区二区三区在线免费观看| 国产欧美精品xxxx另类| 综合久久五月天| 色婷婷综合久久久久中文字幕1| 国产亚洲精品久久久久久牛牛| 国产成人综合亚洲| 欧美三级欧美成人高清www| 亚洲欧美在线第一页| 伊人成人开心激情综合网| 亚洲视频在线观看免费| 成人自拍性视频| 久久久国产精品亚洲一区| 一区二区日韩精品| 91亚洲精品久久久久久久久久久久| 国产成人精品日本亚洲专区61| 欧美第一黄网免费网站| 亚洲人成电影网站色xx| 精品久久久久久久久久久久久| 欧美极品在线视频| 欧美日韩国产丝袜美女| 96sao精品视频在线观看| 亚洲欧美日韩精品久久奇米色影视| 51精品国产黑色丝袜高跟鞋| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲免费视频网站| 91在线免费看网站| 国内外成人免费激情在线视频网站| 亚洲欧美日韩一区在线| 亚洲欧美日韩中文在线制服| 欧美极品少妇xxxxⅹ喷水| 国产精自产拍久久久久久蜜| 国产丝袜精品第一页| 中文字幕亚洲情99在线| 午夜精品www| 日韩国产欧美精品一区二区三区| 国产精品久久久av久久久| 2019中文字幕全在线观看| 久久视频在线直播| 欧美性猛交xxxx乱大交蜜桃| www.亚洲男人天堂| 欧美大胆在线视频| 国产欧美在线观看| 夜夜嗨av色一区二区不卡| 亚洲天堂视频在线观看| 日韩av在线看| 亚洲japanese制服美女| 日韩av在线免费观看| 成人欧美一区二区三区黑人孕妇| 亚洲精品久久久一区二区三区| 欧美性猛交xxxx黑人猛交| 中文字幕免费国产精品| 国产成人精品优优av| 亚洲欧洲xxxx| 国产精品国产三级国产专播精品人| 清纯唯美日韩制服另类| 国产精品视频最多的网站| 中文字幕国内精品| 日韩激情av在线播放| 在线免费观看羞羞视频一区二区| 成人a免费视频| 欧美多人爱爱视频网站| 91麻豆国产精品| 欧美性视频精品| 成人国产在线视频| 午夜精品一区二区三区在线播放| 亚洲精品成a人在线观看| 青青草99啪国产免费| 色老头一区二区三区在线观看| www.日本久久久久com.| 国产精品亚洲片夜色在线| 精品国产一区二区三区久久狼黑人| 在线看日韩av| 国a精品视频大全| 久青草国产97香蕉在线视频| 亚洲天堂av网| 亚洲黄色在线看| 国产精品美腿一区在线看| 91视频国产精品| 亚洲va欧美va国产综合久久| 国产精品久久电影观看| 国产精品午夜视频| 国产精品一区二区久久| 久久国产精品久久精品|