在开发应用的过程中经常会遇到显示一些不同的字体风格的信息,如关键词高亮显示的等。对于类似的情况,一般我们会想着使用多个TextView去实现,对于每个TextView设置不同的字体风格来满足需求。

  这里推荐的做法是使用android.text.*;和android.text.style.*;下面的组件来实现,即在一个TextView中设置不同的字体风格。主要的基本工具类有android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder;使用这些类来代替常规String。SpannableString和SpannableStringBuilder可以用来设置不同的Span,这些Span便是用于实现Rich Text,比如粗体,斜体,前景色,背景色,字体大小,字体风格等等,android.text.style.*中定义了很多的Span类型可供使用。下面列出一些SpannableString的属性:
 
  最近刚好要做一个填空题类型的考题的呈现方式,使用到这一块,记录下来。不多说了,效果图先摆上,其中只有2个标识符,但无论几个都行的,测试了很多遍。
 
正文:
  1. int[] indexs = StringUtil.getRepeatIndexs(content, PARAM_FLAG);
  2. int start = 0;
  3. int end = 0;
  4. for (int i = 0; i < indexs.length; i++) {
  5. String text = mTarget.getUserPassage().split(PARAM_SPLIT)[i];
  6. if (null == text || text.equals(" ")) {
  7. text = PARAM_FLAG;
  8. }
  9. end = indexs[i];
  10. mTvQuestion.append(content.substring(start, end));
  11. mTvQuestion.append(Html.fromHtml("<a href=" + end + " >" + text + "</a>"));
  12. start = end + PARAM_FLAG.length();
  13. }
  14. mTvQuestion.append(content.substring(start));
该段代码将识别一段文本中的所有标识符。TextView有一个append方法,然后可以不断的向其中添加可视文本。
置于For循环以外的tv_msg.append(content.substring(count))指的是添加在最后一个标识符以后的普通文本,这是必须要加的,否则整个文本将不完整。
重要的在于mTvQuestion.append(Html.fromHtml("<a href=" + end + " >" + text + "</a>"));我们将利用这句话给标识符加下划线,利用其中的href属性识别标识符为进行点击做准备。
  1. if (mIsExam) {
  2. // 通过setMovementMethod设置LinkMovementMethod类型来使LinkText有效
  3. mTvQuestion.setMovementMethod(LinkMovementMethod.getInstance());
  4. final CharSequence text = mTvQuestion.getText();
  5. if (text instanceof Spannable) {
  6. int length = text.length();
  7. Spannable sp = (Spannable) text;
  8. //获取文本中原有的URLSpan类型的文本,保存起来
  9. URLSpan[] urls = sp.getSpans(0, length, URLSpan.class);
  10. //使用text创建一个SpannableStringBuilder,通过clearSpans()方法清除原有的Span
  11. SpannableStringBuilder style = new SpannableStringBuilder(text);
  12. style.clearSpans();
  13. // 重新设置text中的URLSpan
  14. for (int i = 0; i < urls.length; i++) {
  15. URLSpan url = urls[i];
  16. final int position = i;
  17. final String value = mTarget.getUserPassage().split(PARAM_SPLIT)[i];
  18. style.setSpan(
  19. new ClickableSpan() {
  20. private boolean isClick = false;
  21. private TextPaint ds;
  22. @Override
  23. public void updateDrawState(TextPaint ds) {
  24. if (isClick) {
  25. ds.setColor(Color.GREEN);
  26. } else {
  27. this.ds = ds;
  28. ds.setColor(Color.RED);
  29. }
  30. ds.setUnderlineText(true);
  31. }
  32. @Override
  33. public void onClick(View keyView) {
  34. isClick = true;
  35. //弹出输入对话框
  36. showDialog(content, position, value);
  37. updateDrawState(ds);
  38. }
  39. }, sp.getSpanStart(url), sp.getSpanEnd(url),
  40. Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  41. }
  42. mTvQuestion.setText(style);
  43. }
  44. }

该段代码使用ClickableSpan实现点击事件,并且实现超链接单击后变色的功能。注释写的很清楚,相信大家都看的懂,我就不再说明了。

TextView 为部分文字添加下划线,并实现单击事件的更多相关文章

  1. UILabel,文字添加下划线,中划线

    //显示下划线 //中划线 //        NSDictionary *attribtDic = @{NSStrikethroughStyleAttributeName: [NSNumber nu ...

  2. iOS 给UILabel文字加下划线

    摘自:http://blog.sina.com.cn/s/blog_6cd380c10101b6hn.html //带下划线的“注” NSMutableAttributedString可变的属性字符串 ...

  3. iOS开发-UILabel和UIButton添加下划线

    关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选择 ...

  4. vim显示行号、语法高亮、自动缩进、添加下划线的设置

    ubuntu默认是没有安装vim的,所以设置以前请先安装vim:sudo apt-get install vim. 然后 打开vim的配置文件:sudo vim /etc/vim/vimrc 或者 s ...

  5. Android 给EditText添加下划线

    在安卓高版本,默认是有下划线的,其默认下划线的颜色是由其主题颜色来控制的! 控制如下: <style name="AppTheme" parent="Theme.A ...

  6. IOS UIlabel 、UIButton添加下划线

    1.给UILabel 添加下划线 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )]; label.backgrou ...

  7. UILabel和UIButton添加下划线

    关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的 NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选 ...

  8. "为文本添加下划线"组件:<u> —— 快应用组件库H-UI

     <import name="u" src="../Common/ui/h-ui/text/c_tag_underline"></impor ...

  9. Android TextView 添加下划线的几种方式

    总结起来大概有5种做法:  1. 将要处理的文字写到一个资源文件,如string.xml(使用html用法格式化)   2. 当文字中出现URL.E-mail.电话号码等的时候,可以将TextView ...

随机推荐

  1. crm2011js操作选项卡和节点

    CRM窗口选项卡的操作 crm2011节点的操作

  2. opengl笔记—— glMultMatrixf() 区别 glLoadMatrixf()

    能找到最好的解释来自:http://www.gamedev.net/topic/489879-glpushmatrixglpopmatrix--glloadmatrixf/ 原理: glPushMat ...

  3. arm+linux 裸机环境搭建之安装工具篇(eclipse)

    之前已经讲述如何安装gcc和gdb,在此不赘述! 一.所需要的软件有两个: jre-7u25-linux-i586.rpm(虚拟机) eclipse-cpp-kepler-R-linux-gtk .t ...

  4. ORACLE AWR概述及生成AWR报告

    1.Overview of the Automatic Workload Repository The Automatic Workload Repository (AWR) collects, pr ...

  5. golang基础数据结构

    一.概述: 这里主要讨论四种类型---数组.slice.map和结构体 数组和结构体是聚合类型:它们的值都是由很多个元素或者成员字段的值组成.数组是有同构元素组成--每个数组的元素的类型相同:结构体为 ...

  6. last reboot

    last reboot是一个linux命令,查看上次重启时间等相关信息

  7. jQuery Tags Input Plugin 插件的使用

    一个jquery开发的标签功能加强插件,可以生成或删除标签,还能对输入重复标签进行检查,和JQuery autocomplete插件配合实现自动完成功能. 官网:http://xoxco.com/pr ...

  8. win server 2003 将MBR转为GPT突破硬盘2TB的限制(附微软磁盘科普)

    备注:https://technet.microsoft.com/zh-cn/library/cc773223.aspx GUID 分区表 与支持最大卷为 2 TB (terabytes) 并且每个磁 ...

  9. js问题学习

    1.前言为了node.js做准备,js的基本功还是很重要的.所以正值1024程序员节的时候所以找了些题目,整理了一下知识点.这篇文章感觉代码太多,难免枯燥,所以文章最后留了个彩蛋给读者. 2.简单回调 ...

  10. java Timer 使用小结

    Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务.这种方式可以让程序按照某一个频度执行,但不能指定时间运行.用的较少. 任务的调用通过起的子线程进 ...