Html类TagHandler接口

来源:互联网 发布:网络维护要什么证件 编辑:程序博客网 时间:2024/05/20 13:07
http://blog.csdn.net/u010418593/article/details/9322197

 

[java] view plaincopy
  1. mTvA = (TextView) this.findViewById(R.id.tv_html_label_a);  
  2. // 超链接标签  
  3. String htmlA = "<a href='http://blog.csdn.net/u010418593'>超链接测试</href>";  
  4. // 设置文本数据  
  5. mTvA.setText(Html.fromHtml(htmlA));  
  6. // 该方法在需要响应用户事件时使用  
  7. mTvA.setMovementMethod(LinkMovementMethod.getInstance());  
  8.   
  9.   
  10. mTvFont = (TextView) this.findViewById(R.id.tv_html_label_font);  
  11. // font标签  
  12. String htmlFont = "<font size='20' color='red' = face='verdana'>font标签测试</font>";  
  13. mTvFont.setText(Html.fromHtml(htmlFont));  

 

上面代码中的为mTvA设置了超链接文本,如果想在点击后进入相应的链接地址则需要通过mTvA设置setMovementMethod(LinkMovementMethod.getInstance());而mTvFont则设置了font标签,并为标签设置了size、color、face属性,效果如下图:

 

 

上图中的"超链接测试"文本是链接的形式显示的,而在下方则是font标签的测试,发现我们为其设置的size为20并没有效果,这是因为并不支持该属性;接下来我们便定义一个<size>标签,具体代码如下:

 

自定义size标签

 

[java] view plaincopy
  1. /** 
  2.  * size标签 
  3.  * @author Susie 
  4.  */  
  5. public class SizeLabel implements TagHandler {  
  6.       
  7.     private int size;  
  8.   
  9.     public SizeLabel(int size) {  
  10.         this.size = size;  
  11.     }  
  12.   
  13.     @Override  
  14.     public void handleTag(boolean opening, String tag, Editable output,  
  15.             XMLReader xmlReader) {  
  16.         /** 
  17.          * 参数: 
  18.          * opening:为true时表示开始解析,为false时表示解析完 
  19.          * tag:当前解析的标签 
  20.          * output:文本中的内容 
  21.          * xmlReader:xml解析器 
  22.          */  
  23.           
  24.         // 判断当前解析的tag是否为size,并且已经解析完毕(在没有解析完毕之前output中没有数据)  
  25.         if(tag.toLowerCase().equals("size") && !opening) {  
  26.             // 通过output调用setSpan方法,改变文本的0下标到最后的下标的大小;  
  27.             // 最后的参数用来标识在span范围内的文本前后输入新的字符时是否也改变它们的效果;  
  28.             output.setSpan(new AbsoluteSizeSpan(size), 0, output.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  29.         }  
  30.     }  
  31. }  


 

Activity类

[java] view plaincopy
  1. /** 
  2.  * 自定义html标签 
  3.  * @author Susie 
  4.  */  
  5. public class SizeLabelActivity extends Activity {  
  6.   
  7.     private TextView mTvSizeLabel;  
  8.       
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_size_label);  
  13.           
  14.         mTvSizeLabel = (TextView) this.findViewById(R.id.tv_custom_label_view);  
  15.         String html = "<font color='red' face='verdana'><size>自定义Html标签</size></font>";  
  16.         // 为其设置文本,参数:文本、<img>标签的回调、自定义标签会滴;  
  17.         mTvSizeLabel.setText(Html.fromHtml(html, nullnew SizeLabel(20)));  
  18.           
  19.     }  
  20. }  


 

我们通过实现TagHandler接口并在handleTag方法中对自定义的标签做相应的处理即可,Html.fromHtml(source,imageGetter,tagHandler)方法中的参数即为要解析的HTML文本,<img>标签的回调我们传递null即可,而tagHandler传递的则是我们自定义的标签;其中setSpan方法中的flag参数有如下:

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE前后都不包括;

Spanned.SPAN_INCLUSIVE_EXCLUSIVE包括前面,不包括后面;

Spanned.SPAN_EXCLUSIVE_INCLUSIVE不包括签名,包括后面;

Spanned.SPAN_INCLUSIVE_INCLUSIVE前后都包括;

这些参数的意思是当我们改变的文本的显示效果后(如粗体、斜体、下划线等),在为其通过append()方法添加了新的字符时是否需要改变它们的效果;

 

 

 

 

0 0
原创粉丝点击