超文本: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.
*/
@Override
public 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;
} @Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//设置文本的颜色
ds.setColor(Color.RED);
//超链接形式的下划线,false 表示不显示下划线,true表示显示下划线
ds.setUnderlineText(false);
} @Override
public 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),,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. Linux的文本处理工具浅谈-awk sed grep

    Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...

  2. 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作

    目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...

  3. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  4. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  5. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

  6. 浅谈Android五大布局

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  7. 浅谈 Requests包

    浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...

  8. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. rails从4.0.2降到3.2.9

    初学ruby和rails,想和教程同步,把rails的版本降下来.从4.0.2降到3.2.9 [lucas@lucas ~]$ rails -v Rails 4.0.2 尝试了 sudo gem un ...

  2. Log4Net 手册

    首先感慨下,现在的程序员做的工作因为高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成越来越偏向 “面向配置编程”了...... 详细使用指南见文章:http://blog.csdn.net ...

  3. java中String byte HexString的转换

    原文:http://blog.sina.com.cn/s/blog_62e9ec530101ebv6.html HexString——>byte public static byte[] hex ...

  4. 使用的 SQL Server 版本不支持数据类型“datetime2”的错误解决方法

    THE VERSION OF SQL IN USE DOES NOT SUPPORT DATATYPE ‘DATETIME2′ 主要错误原因,在使用ado.net entity的时候,entity使用 ...

  5. Supervisor – 用于 Unix 系统的进程监控工具

    Supervisor 是一个客户端/服务端模式的系统,使用户能够监视和控制 UNIX 操作系统的进程.Supervisor 为你提供一个地方来启动,停止和监视进程.进程可以单独或成组的形式控制.您还可 ...

  6. 将excel导入mysql(使用navicat)

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

  7. Direct2D开发:纹理混合

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 我们都知道Direct2D可以加载并显示图片,但是不知道你有没有想过,这个2D的图形引擎可以进行纹理混合吗?如果 ...

  8. Android 学习笔记之网络通信基础+WebView....

    PS:加快学习进度...下周一完成Android网络通信...然后正式进入实战... 学习内容: 1.Android中Http基础... 2.Android中的Socket基础... 3.Androi ...

  9. 阅读Nosql代码有感

    这一年总得来说,读书的时间不多.一是因为时间啥关系,这一年一直在跟着项目走,或者被项目牵着走,几乎所有的时间和精力全部被拴在几个项目上:不过所幸今年创业失败,又回去上班了,时间相对空余了一些. 双十一 ...

  10. Sprint第三个冲刺(第三天)

    一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图: