(android 實戰總結)android對html支援介面總結

來源:互聯網
上載者:User

前沿:

項目中往往需要顯示一段文本,如果對文本需要特定的效果,就要寫自訂的span,這樣的工作量會變得很大,目前android支援html格式的文本,下面就是我對android支援html的程度和使用方式的總結。

 

Android支援html 的兩個介面

 

1   Spanned android.text.Html.fromHtml(String source)

輸入的參數為(html格式的文本)

 

目前android不支援全部的html的標籤,目前只支援與文本顯示和段落等標籤,對於圖片和其他的多媒體,還有一些自訂標籤不能識別

 

2 Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)Source:    需處理的html文本

imageGetter :對圖片處理(處理html中的圖片標籤)

tagHandler  :對標籤進行處理(相當於自訂的標籤處理,在這裡面可以處理自訂的標籤)

 

在第二個介面中,在實際應用中,需要處理html中的img為網狀圖片,同時也需要處理一些自訂的標籤 如【視頻】,下面我就說明這兩塊的概要實現

 

【1】       實現ImageGetter擷取網狀圖片

 

 ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {

Drawable d=null;
try
{
URL aryURI = new URL(source);
/* 開啟串連 */
URLConnection conn = aryURI.openConnection();
conn.connect();
/* 轉變為 InputStream */
InputStream is = conn.getInputStream();
/* 將InputStream轉變為Bitmap */
//Bitmap bm = BitmapFactory.decodeStream(is);
/* 關閉InputStream */

/*添加圖片*/
d=Drawable.createFromStream(is, "111");
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
d.setBounds(1, 1, 45, 45);
return d;
}

 以上代碼已經實際檢驗過,請放心copy

 

註:public Drawable getDrawable(String source)

中Source 代表 <img> 標籤中的圖片路徑

 

【2】       實現 自訂的TagHandler

實現的概要說明:

Step one 繼承 TagHandler介面

Step Two 實現

public void handleTag(boolean opening, String tag, Editable output,

            XMLReader xmlReader)

 

介面被調用的過程:

 

 系統在解析html文本

發現tag時調用一次 如<html>

介面傳遞的參數為 handleTag(true,”html”,output , xmlReader )

 

  發現tag的閉合時,調用介面

介面傳遞的參數為 handleTag(false,”html”,output , xmlReader )

 

下面是一個實際執行的例子 給< strike> 標籤 中的文字加上橫線

 

public class MyHtmlTagHandler implements TagHandler {

public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}

private void processStrike(boolean opening, Editable output) {
int len = output.length();
if(opening) {
output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, StrikethroughSpan.class);
int where = output.getSpanStart(obj);

output.removeSpan(obj);

if (where != len) {
output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}

private Object getLast(Editable text, Class kind) {
Object[] objs = text.getSpans(0, text.length(), kind);

if (objs.length == 0) {
return null;
} else {
for(int i = objs.length;i>0;i--) {
if(text.getSpanFlags(objs[i-1]) == Spannable.SPAN_MARK_MARK) {
return objs[i-1];
}
}
return null;
}
}

}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.