Html类TagHandler接口

时间:2024-11-17 16:08:36

在之前的Html类支持的HTML标签文章中了解到了Android中Html类只支持了HTML中的少量标签,但是我们可以通过实现TagHandler接口来定义我们自己的标签;我们先来看看<a>标签和<font>标签;

 

 

  1. mTvA = (TextView) this.findViewById(.tv_html_label_a);
  2. // 超链接标签
  3. String htmlA = "<a href='/u010418593'>超链接测试</href>";
  4. // 设置文本数据
  5. ((htmlA));
  6. // 该方法在需要响应用户事件时使用
  7. (());
  8. mTvFont = (TextView) this.findViewById(.tv_html_label_font);
  9. // font标签
  10. String htmlFont = "<font size='20' color='red' = face='verdana'>font标签测试</font>";
  11. ((htmlFont));

 

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

 

 

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

 

自定义size标签

 

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


 

Activity类

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


 

我们通过实现TagHandler接口并在handleTag方法中对自定义的标签做相应的处理即可,(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()方法添加了新的字符时是否需要改变它们的效果;