前言

我们在给TextView设置超链接的时候,可能最简单的,Android已经给出了一个非常的简单的做法就是:
在xml中设置:

<!--all表示匹配所有,web表示匹配网址 -->
android:autoLink="web"

或者

//sp为SpannableString
Linkify.addLinks(sp, Linkify.WEB_URLS);

如何设置超链接颜色

上边如果设置,就可以完成基本功能,但是安装在不同的手机上,超链接的颜色都会不同,比如vivo的一个机子上是黑色的,显示的样式也不一样!

所以,这里只能使用URLSpan手动去匹配,并设置颜色:

        //注意:不要在xml配置android:autoLink属性SpannableString sp = new SpannableString(str);//这句很重要,也可以添加自定义正则表达式Linkify.addLinks(sp, Linkify.WEB_URLS);//主要是获取span的位置URLSpan[] spans = sp.getSpans(0, str.length(), URLSpan.class);//这里可以用过循环处理就可以动态实现文本颜色的差别化了//设置高亮样式一for (URLSpan span : spans) {sp.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.base_blue)), sp.getSpanStart(span), sp.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}//SpannableString对象设置给TextViewmTv.setText(sp);//设置TextView可点击mTv.setMovementMethod(LinkMovementMethod.getInstance());

问题,textview点击事件失效

为什么会出现这样的问题,是因为LinkMovementMethod中onTouchEvent(MotionEvent event),在ACTION_UP事件中,返回了true,表示这里已经消费了up事件,那么自然不会再响应它的点击事件!
所以,这里的解决方案:
我在stackoverflow上找到一个回答:listview-textview-with-linkmovementmethod-makes-list-item-unclickable

public class LinkTextView extends android.support.v7.widget.AppCompatTextView {boolean dontConsumeNonUrlClicks = true;boolean linkHit;public LinkTextView(Context context) {super(context);}public LinkTextView(Context context, AttributeSet attrs) {super(context, attrs);}public LinkTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onTouchEvent(MotionEvent event) {linkHit = false;boolean res = super.onTouchEvent(event);if (dontConsumeNonUrlClicks)return linkHit;return res;}public static class LocalLinkMovementMethod extends LinkMovementMethod {static LocalLinkMovementMethod sInstance;public static LocalLinkMovementMethod getInstance() {if (sInstance == null)sInstance = new LocalLinkMovementMethod();return sInstance;}@Overridepublic boolean onTouchEvent(TextView widget,Spannable buffer, MotionEvent event) {int action = event.getAction();if (action == MotionEvent.ACTION_UP ||action == MotionEvent.ACTION_DOWN) {int x = (int) event.getX();int y = (int) event.getY();x -= widget.getTotalPaddingLeft();y -= widget.getTotalPaddingTop();x += widget.getScrollX();y += widget.getScrollY();Layout layout = widget.getLayout();int line = layout.getLineForVertical(y);int off = layout.getOffsetForHorizontal(line, x);ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);if (link.length != 0) {if (action == MotionEvent.ACTION_UP) {link[0].onClick(widget);} else if (action == MotionEvent.ACTION_DOWN) {Selection.setSelection(buffer,buffer.getSpanStart(link[0]),buffer.getSpanEnd(link[0]));}if (widget instanceof LinkTextView) {((LinkTextView) widget).linkHit = true;}return true;} else {Selection.removeSelection(buffer);Touch.onTouchEvent(widget, buffer, event);return false;}}return Touch.onTouchEvent(widget, buffer, event);}}
}

然后在使用的时候:

//设置TextView可点击,并且调用自定义的LinkMovementMethod,不是url,返回false,否则会消费掉点击事件
mTv.setMovementMethod(LinkTextView.LocalLinkMovementMethod.getInstance());

首先我们自定义一个TextView,定义一个布尔值,是否点击了超链接,然后我们继承LinkMovementMethod,在他的onTouchEvent中,如果确实是点击的span,则将上边的属性置为true,然后在TextView的onTouchEvent中,返回这个属性即可!(如果点击的是超链接,return true,如果不是超链接,则return false,事件会继续往下分发,检查是否注册的有点击事件,而去响应点击事件!)

Android TextView设置自动识别的超链接字体颜色,及自身点击事件无响应的解决办法相关推荐

  1. Android TextView 设置文字背景色或文字颜色,字体阴影,字体样式

          String str="这是设置TextView部分文字背景颜色和前景颜色的demo!";         int bstart=str.indexOf("背 ...

  2. Android中设置RecyclerView的每一个item的单项点击事件

    场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  3. secureCRT字体颜色、文件夹和文件区分显示的解决办法

    1.右键Sessions,打开属性,如下图. 2.打开之后如下图所示. 3.点击外观,如图所示. 4.修改颜色方案为Traditional. 5.修改之后的结果,可以明显的区分文件与文件夹的类型,如图 ...

  4. android曲面屏点击事件无响应,都说曲面屏中看不中用,主要原因有四点,第三点是关键!...

    都说曲面屏中看不中用,主要原因有四点,第三点是关键! 2020-11-17 11:29:39 0点赞 0收藏 0评论 回归纯平屏幕的iPhone 12发布后,那些直屏党用户的呼声更高了,而上一次还是在 ...

  5. android String文件中修改部分字体颜色

    修改部分字体颜色各位同学都知道可以使用SpannableStringBuilder,其实我们可以还有别的简单方式配合Html.fromHtml() 方案一:用SpannableStringBuilde ...

  6. 设置TextView中超链接字体颜色、下划线

    ClickableSpan:这是超链接相关的样式控制和点击事件的控制类,我们需要对它进行继承,然后修改成我们需要的样式.其中,可以对超链接文本字符进行颜色.字体大小.字体.下划线.点击事件的自定义控制 ...

  7. android TextView设置字体颜色

    今天,简单讲讲如何设置TextView的字体颜色. 其实很简单,不过之前忘记了,所以还是记录,总结一下. TextView的字体设置方法: 1.直接通过配置文件设置 2.在Activity类中进行设置 ...

  8. android textview 字体颜色设置,Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  9. android+设置字体行高,android textview设置字体的行距和字间距

    android textview设置字体的行距和字间距 字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView ...

最新文章

  1. easyui 页面加载闪现问题 解决方法
  2. 【程序员的英语】出奇制胜-那你得乖乖学英语啊!
  3. linux 中使用 crontab 执行定时任务
  4. IO流常用的体系结构
  5. kafka拉取mysql数据库_kafka里信息用flink获取后放入mysql
  6. 上传图片并显示缩略图的最简单方法(c#)
  7. 电脑主板接口_如何看电脑主板 M.2 接口是支持 SATA 还是 NVMe 固态硬盘?
  8. zabbix_nginx监控
  9. 白话空间统计二十四:地理加权回归(六)ArcGIS的GWR工具参数说明一
  10. C语言的源代码文件、目标文件和可执行文件
  11. Mars《Android开发视频教程》
  12. h5扫描pc端二维码登录
  13. EFM32芯片jlink无法连接,无法调试,解锁流程
  14. 你还在担心黑客攻击吗?所有程序员都应该掌握的基础网络安全知识,快进来看看吧
  15. 软件工程——经验软件工程概述
  16. 微信红包雨怎么抢_微信红包雨怎么发出? 微信红包雨发送技巧有哪些?
  17. Flappy Bird引爆山寨应用热:谁火我就模仿谁
  18. OEM、ODM别再混淆了,TCOOP教您轻松辨别
  19. Linux centos 64位 mysql安装教程
  20. JAVA大数据(一)简介-Hadoop环境配置,伪分布式模式架构学习用

热门文章

  1. 统计推断(九) Graphical models
  2. ObjectBox[八] 关系
  3. python traceback安装_python之traceback
  4. 网站安全服务应该如何安全储存用户数据
  5. php如何做服务器,如何用php实现一个web服务器
  6. 地砖设计 贪心、字符串
  7. python正则表达式贪婪匹配_Python正则表达式教程之三:贪婪/非贪婪特性
  8. python 求 gamma 分布_Python stats.gamma方法代码示例
  9. 2022-2027年中国苦荞茶饮料行业发展前景及投资战略咨询报告
  10. NEC成功完成对Avaloq的收购