Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
extView富文本顯示主要有兩種方式,一個是使用SpannableString類,另一種是直接將富文本寫成HTML形式。
SpannableString是Android內置的專門處理富文本的類,基本涵蓋了你能想到的所有富文本表示,字體、顏色、圖片、點擊事件等
//設置Hello World前三個字符為紅色,背景為藍色
SpannableString textSpanned1=new SpannableString("Hello World");
textSpanned1.setSpan(new ForegroundColorSpan(Color.RED),
0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textSpanned1.setSpan(new BackgroundColorSpan(Color.BLUE),
0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
text1.setText(textSpanned1);
//設置Hello World前三個字符字體為斜體
SpannableString textSpanned2=new SpannableString("Hello World");
textSpanned2.setSpan(new StyleSpan(Typeface.ITALIC),
0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
text2.setText(textSpanned2);
//設置Hello World前三個字符有下劃線
SpannableString textSpanned3=new SpannableString("Hello World");
textSpanned3.setSpan(new UnderlineSpan(),
0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
text3.setText(textSpanned3);
//設置Hello World前三個字符有點擊事件
SpannableStringBuilder textSpanned4=new SpannableStringBuilder("Hello World");
ClickableSpan clickableSpan=new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "Hello World", Toast.LENGTH_SHORT).show();
}
};
textSpanned4.setSpan(clickableSpan,
0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//注意:此時必須加這一句,不然點擊事件不會生效
text4.setMovementMethod(LinkMovementMethod.getInstance());
text4.setText(textSpanned4);
setSpan()
void setSpan (Object what, int start, int end, int flags)
參數 | 說明 |
what | 樣式 |
start | 樣式開始的字符索引 |
end | 樣式結束的字符索引 |
flags | 新插入字符的設置 |
flags:
取值 | 說明 |
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | 前后都不包括 |
Spanned.SPAN_EXCLUSIVE_INCLUSIVE | 前面不包括,后面包括 |
Spanned.SPAN_INCLUSIVE_EXCLUSIVE | 前面包括,后面不包括 |
Spanned.SPAN_INCLUSIVE_INCLUSIVE | 前后都包括 |
這個flags可能有人不懂,它表示了這個樣式是否作用在本字符串之前或之后插入的其他字符串上
SpannableStringBuilder textSpannedBuilder1=new SpannableStringBuilder();
SpannableString textSpanned11=new SpannableString("Hello");
textSpanned11.setSpan(new BackgroundColorSpan(Color.BLUE), 0, textSpanned11.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString textSpanned12=new SpannableString("World");
text1.setText(textSpannedBuilder1.append(textSpanned11).append(textSpanned12));
SpannableStringBuilder textSpannedBuilder2=new SpannableStringBuilder();
SpannableString textSpanned21=new SpannableString("Hello");
textSpanned21.setSpan(new BackgroundColorSpan(Color.BLUE), 0, textSpanned21.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
SpannableString textSpanned22=new SpannableString("World");
text2.setText(textSpannedBuilder2.append(textSpanned21).append(textSpanned22));
SpannableStringBuilder textSpannedBuilder3=new SpannableStringBuilder();
SpannableString textSpanned31=new SpannableString("Hello");
textSpanned31.setSpan(new BackgroundColorSpan(Color.BLUE), 0, textSpanned21.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
SpannableString textSpanned32=new SpannableString("World");
textSpanned32.setSpan(new BackgroundColorSpan(Color.GREEN), 0, 3, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
text3.setText(textSpannedBuilder3.append(textSpanned31).append(textSpanned32));
text1里,"Hello"的flags是SPAN_EXCLUSIVE_EXCLUSIVE,在它之后插入的"World"顯示正常,無背景。
接下來介紹HTML的用法,其實HTML使用起來要比SpannableString簡潔,我們只需要按照平時寫HTML的習慣,將需要顯示的富文本加上各種標簽,就可以顯示在TextView上了,下面我們看一下例子:
String htmlText1="<b>Hello World</b>";
text1.setText(Html.fromHtml(htmlText1));
String htmlText2="<font color='#ff0000'>Hello World</font>";
text2.setText(Html.fromHtml(htmlText2));
String htmlText3="<i><a href='https://gavinli369.github.io/'>我的博客</a></i>";
text3.setMovementMethod(LinkMovementMethod.getInstance());
text3.setText(Html.fromHtml(htmlText3));
TextView支持的HTML標簽
標簽 | 說明 |
font | 設置字體和顏色 |
big | 大號字體 |
small | 小號字體 |
i | 斜體 |
b | 粗體 |
tt | 等寬字體 |
br | 換行(行與行之間沒有空行) |
p | 換行(行與行之間有空行) |
a | 鏈接 |
img | 圖像 |
ndroid 中的 TextView 組件常用于顯示文本內容,其實它也可以顯示 HTML 的內容。簡單來講,這就需要先把 HTML 的內容以字符串的形式獲取后,經過 android.text.Html.fromHtml()轉化成 Spanned 的格式,然后將其傳遞到 TextView 的 setText()方法中,這樣就可以在 TextView 中顯示 HTML 頁面的內容了。需要注意的是,并不是所有的 HTML 標簽在 TextView 中都是支持的,且官方文檔并沒有明確的說明支持 HTML 標簽列表,通過查看 Android 源代碼,可以得到簡單的支持列表。
{<br>,< p>,< div align=>,< strong>, <b>, <em>, <cite>, <dfn>, <i>, <big>, <small>, <font size=>, <font color=>, <blockquote>, <tt>, <a href=>, <u>, <sup>, <sub>, <h1>,<h2>,<h3>,<h4>,<h5>,<h6>, <img src=>, <strike>}
1
下面的示例來介紹如何在 TextView 中顯示一段 HTML 內容,要顯示的這段 HTML 內容即包含超鏈接內容,也包含有圖片。
在 TextView 中顯示 HTML 內容
顯示的過程中最主要的過程就是調用 Android.text.Html 類提供的 fromHtml()方法,將一段 HTML 內容轉化為 Spanned 對象。
Android.text.Html 類提供的 fromHtml()方法使用如下清單 4
fromHtml()方法定義
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
……
HtmlToSpannedConverter converter=new HtmlToSpannedConverter(source, imageGetter, tagHandler, parser);
return converter.convert();
}
1234567
source,就是包含 HTML 內容的字符串。而 Html.ImageGetter 和 Html.TagHandler 是兩個接口,提供給開發者繼承使用。
imageGetter, 如果要顯示圖片是需要被繼承的,重寫 getDrawable(String source)方法,用于獲取 HTML 里面的圖片來顯示在 TextView 中。
tagHandler,其作用是把 HTML 帶標記的文本內容字符串轉化成可以顯示效果的的 Spanned 字符串 。由于并非所有的 HTML 標簽都可以轉化,所以在使用時,用戶需要自己添加一些必要的標簽和處理方法時才會繼承使用的。
在本例中使用 fromHtml()方法之前,要準備好該方法要用的三個參數內容,首先將 HTML 字符串內容準備好,在項目中需要創建兩個類 MImageGetter 和 MTagHandler 分別繼承于 ImageGetter 和 TagHandler,分別用戶圖片的獲取,和特殊標簽的支持。
MImageGetter
繼承于 ImageGetter,重寫 getDrawable (String source) 方法中從 assets 路徑下取出的圖片流(這里當然也可以通過網絡操作來完成圖片流的獲取),最后獲得可供顯示的圖片對象,例如 Drawable 對像。由于 Android 設備的異構性,為了有更好的顯示效果,通常需要獲取屏幕大小,然后調用 drawable.setBounds () 還可以重新設置圖片的大小, 最后返回合適大小的圖片 Drawable 對象。 由此 Spanned 中的 ImageSpan 就獲得了圖像被顯示在 TextView 中對應位置了。
TypedValue typedValue=new TypedValue();
typedValue.density=TypedValue.DENSITY_DEFAULT;
drawable=Drawable.createFromResourceStream(null, typedValue, is, "src");
DisplayMetrics dm=c.getResources().getDisplayMetrics();
int dwidth=dm.widthPixels-10;//padding left + padding right
float dheight=(float)drawable.getIntrinsicHeight()*(float)dwidth/(float)drawable.getIntrinsicWidth();
int dh=(int)(dheight+0.5);
int wid=dwidth;
int hei=dh;
drawable.setBounds(0, 0, wid, hei);DisplayMetrics dm=c.getResources().getDisplayMetrics();
12345678910
MTagHandler
繼承于 TagHandler,重寫了 handleTag()方法,為的是支持部分標簽,這四個標簽是在 formHtml()方法中本身是不支持。如果開發者認為安卓 TagHandler 提供的默認標簽解析已經夠用,直接在 fromHtml()方法中第三個參數的地方填寫 null 既可。
重寫 handleTag()方法
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
if (tag.equals("ul") || tag.equals("ol") || tag.equals("dd")) {
if (opening) {
mListParents.add(tag);
} else mListParents.remove(tag);
} else if (tag.equals("li") && !opening) {
handleListTag(output);
}
}
private void handleListTag(Editable output) {
……
}
123456789101112
最后,在完成了 MImageGetter、MTagHandler 以后,就可以通過 formHtml()方法將 HTML 內容轉化為可供顯示的 SpannableString,將 SpannableString 通過 setText 方法放入 TextView 中,就可以顯示圖文并茂的內容了。
progressBar.setVisibility(View.GONE);
text.setText(Html.fromHtml(htmlCont, new MImageGetter(text,MainActivity.this), new MTagHandler()));
text.setVisibility(View.VISIBLE);
123
MImageGetter、MTagHandler 如下:
源碼下載:http://www.dandroid.cn/?p=3278
源碼下載:http://www.dandroid.cn/?p=3275
*請認真填寫需求信息,我們會在24小時內與您取得聯系。