超文本:http://www.baidu.com

这么一个效果:一行文本当中 前面显示黑色颜色的“超文本:”,后面显示红色颜色的“http://www.baidu.com” 并且要求红色字体的部分可以点击,有响应的点击事件进行处理,你该如何实现?

最简单的实现方法,两个TextView ,第一个显示黑色字体的“超文本”,第二个显示红色字体的“http://www.baidu.com”,然给给第二个TextView添加一个点击事件。

想想,确实可以这么实现,对于一般情况可以

但是,文本长度过长的情况下呢,会出现第二个TextView未能一行显示的文本会换行,但是不是在第二行的一开始

  而你希望的效果是   

----------------------------------------------------------------------------------------------

显然用两个TextView 不好实现,那么如果使用一个TextView实现一段文字,既可以有不同的颜色,也可以实现一段文字不同部分的文字有点击事件呢?

首先,我们必须知道SpannableString 类可以实现同一个TextView不同部分的颜色不同,

不会的可以先去学习下:(转) SpannableString与SpannableStringBuilder

既然我们知道了如何实现一个TextView显示不同的颜色,那么还有一个问题就是如何实现点击 同一个TextView不同部分的文字进行相应的响应操作

现在就学习:

ClickableSpan

源码很短,直接贴出,我加上个人翻译,大家看看吧:

/*** If an object of this type is attached to the text of a TextView* with a movement method of LinkMovementMethod, the affected spans of* text can be selected.  If clicked, the {@link #onClick} method will* be called.   如果这个TextView使用了.setMovementMethod()方法,那么这部分setSpan()的文本部分可以被选择,如果点击了,会执行onClick()接口回调方法*/
public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {/*** Performs the click action associated with this span.*/public abstract void onClick(View widget);  /*** Makes the text underlined and in the link color.*/@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(ds.linkColor);            //设置可以点击文本部分的颜色ds.setUnderlineText(true);            //设置该文本部分是否显示超链接形式的下划线}
}

可能有点看不懂,但是不用管,会怎么使用就行,那么怎么使用呢?

1、首先源码里说:

If an object of this type is attached to the text of a TextView* with a movement method of LinkMovementMethod,

那么:

对于一个TextView 先必须要使用  TextView.setMovementMethod(LinkMovementMethod.getInstance());

给一个TextView设置这个属性有什么用呢? 其实就是给这个TextView实现超链接效果,不设置当然就没有点击事件了

2、源码里又说:

the affected spans of* text can be selected.  If clicked, the {@link #onClick} method will* be called.  

那么就是说你setSpan()部分的文本可以显示,并且点击可以实现OnClick()接口回调

所以你需要写一个类来实现ClickableSpan

并且  .setSpan(继承ClickableSpan的类,对应效果的开始位置,对应效果的结束位置, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

----------------------------------------------------------------------------------------------

让我们通过一个Demo来学习 ClickableSpan 的使用:

1、首选 自定义一个类继承ClickableSpan

class MyClickText extends ClickableSpan{private Context context;public MyClickText(Context context) {this.context = context;}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);//设置文本的颜色
            ds.setColor(Color.RED);//超链接形式的下划线,false 表示不显示下划线,true表示显示下划线ds.setUnderlineText(false);}@Overridepublic void onClick(View widget) {Toast.makeText(context,"发生了点击效果",Toast.LENGTH_SHORT).show();}}

2、对TextView进行操作

     private TextView clicktext;clicktext = (TextView) findViewById(R.id.clicktext);SpannableString str = new SpannableString("超文本:http://www.baidu.com");str.setSpan(new MyClickText(this),4,str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//当然这里也可以通过setSpan来设置哪些位置的文本哪些颜色clicktext.setText(str);clicktext.setMovementMethod(LinkMovementMethod.getInstance());//不设置 没有点击事件clicktext.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明

大家看到这里,感觉是不是又长知识了,但是细细琢磨,这个类到底有什么实际的使用呢?

在社交类APP中,一般都用类似QQ空间的功能吧,一个页面以列表的形式显示所有的动态(说说),每一个动态(说说)里又对应着相应的评论

那么我们是不是可以用ClickableSpan类来实现 一个TextView显示不同颜色的文字并且点击相应的位置会有对应的响应事件的效果呢

  问题来了,我们Demo中确定了一个TextView从哪些位置到哪些位置是有颜色或者点击事件的,但是实际项目中,我们并不确定 评论人 和 被评论人的 用户昵称的长度,那么该怎么办呢 ?  -- > QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应相关推荐

  1. python计算现场得分_浅谈用 Python 计算文本 BLEU 分数

    浅谈用 Python 计算文本 BLEU 分数 BLEU, 全称为 Bilingual Evaluation Understudy(双语评估替换), 是一个比较候选文本翻译与其他一个或多个参考翻译的评 ...

  2. 浅谈用Python计算文本BLEU分数

    在本教程中,你探索了BLEU评分,根据在机器翻译和其他语言生成任务中的参考文本对候选文本进行评估和评分. 具体来说,你学到了: BLEU评分的简单入门介绍,并直观地感受到到底是什么正在被计算. 如何使 ...

  3. jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应

    在jsp中,首先,你需要导入jquery的架包: 获取可返回站点的根路径: String path = request.getContextPath(); %> 在jquery中写ajax请求: ...

  4. android 点击文本框,android 文本框部分文字的点击事件

    转载请标明出处. android文本框部分文字点击事件. String text1 = "这是个例子"; String text2 = "点击的文字"; Spa ...

  5. 浅谈航天防伪开票文本接口文件的解析

    航天信息防伪税控开票系统开票文本接口文件格式对外是公开的,只要你安装了防伪税控开票系统,就可以在其安装的目录如:"C:/Program Files/航天信息/防伪开票/DOC/接口文件示例& ...

  6. Qt浅谈之八:富文本转换成pdf

    一.简介 Qt对富文本的处理,主要有几个感兴趣的知识点才写下这篇文章,将文本或图片转换成pdf格式.文件直接拖拽到文本框中.双击对程序全屏和缩小.滚动滑轮对文字放大缩小及安装事件过滤器通过键盘的上下按 ...

  7. 浅谈开发中的MVVM模式及与MVP和MVC的区别

    2019独角兽企业重金招聘Python工程师标准>>> 我记得前段时间分享了一篇文章< 浅谈Andorid开发中的MVP模式>(点击可跳转),反响不错,为了进一步介绍MV ...

  8. 浅谈目前主流NoSql数据库

    浅谈目前主流NoSql数据库,编程学习资料点击免费领取 前言 无意翻资料发现目前好多noSql数据库,但是工作中貌似并没有接触到,很好奇他们的区别,所以就有了这篇文章.(整合了网上许多大佬的文章,如有 ...

  9. 浅谈IM软件业务知识-实现富文本解析,如:解析字符串、网络链接等

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

最新文章

  1. Google I/O 2017 大会时间表出炉:安卓 8.0 时代来临
  2. 暗黑再临Java正版_暗黑破坏神之墨菲斯托
  3. Java SE 6 新特性: Java DB 和 JDBC 4.0
  4. windows下的守护进程C++
  5. 没有互联网,我不会写程序了
  6. unexpected AST node
  7. 什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了
  8. 零基础iOS之Json及XML数据解析2
  9. Shell编程(逻辑判断、文件目录属性判断、if特殊用法、case判断)
  10. 【grafana】grafana 报错 Invalid interval string expecting a number followed by one of Mwdhmsy
  11. Prometheus监控(二)
  12. Notification(一)系统通知的监听移除
  13. talib python文档_TALib中文文档代码实现
  14. 北京理工大学c语言课后答案,《北京理工大学C语言教材习题答案》.doc
  15. 图解项目管理详细流程全景图
  16. my top visited webs
  17. 【英语阅读】纽约时报 | “流浪作家”三毛:撒哈拉、爱情和死亡
  18. Java中Collections.singleton方法起什么作用呢?
  19. 学校智慧校园平台管理系统小程序开发制作
  20. 小常识:保险中的“保全”是什么?

热门文章

  1. 基于REST的MVC架构设计与实现
  2. linux 下的lamp的简单安装
  3. 简单的BMCP位图图片压缩算法
  4. NODE Stream流总结(1)
  5. C# 检测文件是否被其他进程占用
  6. template might not exist or might not be accessible by any of the configured Template Resolvers
  7. 等宽矩阵(a)相乘a %*% x = b的逆运算solve(a,b)=x
  8. SQL Server调优系列进阶篇(如何维护数据库索引)
  9. 【转】C++的面象对象总结
  10. SOC在安全方面的真实价值