(android 实战总结)android对html支持接口总结

Android支持html的两个接口

1Spannedandroid.text.Html.fromHtml(Stringsource)

输入的参数为(html格式的文本)

目前android不支持全部的html的标签,目前只支持与文本显示和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别

2Spannedandroid.text.Html.fromHtml(Stringsource,ImageGetterimageGetter,TagHandlertagHandler)

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

注:publicDrawablegetDrawable(Stringsource)

中Source代表<img>标签中的图片路径

【2】实现自定义的TagHandler

实现的概要说明:

Stepone继承TagHandler接口

StepTwo实现

publicvoidhandleTag(booleanopening,Stringtag,Editableoutput,

XMLReaderxmlReader)

接口被调用的过程:

系统在解析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;            
}        
}
}

相关推荐