Android TextView设置自动识别的超链接字体颜色,及自身点击事件无响应的解决办法
前言
我们在给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设置自动识别的超链接字体颜色,及自身点击事件无响应的解决办法相关推荐
- Android TextView 设置文字背景色或文字颜色,字体阴影,字体样式
String str="这是设置TextView部分文字背景颜色和前景颜色的demo!"; int bstart=str.indexOf("背 ...
- Android中设置RecyclerView的每一个item的单项点击事件
场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...
- secureCRT字体颜色、文件夹和文件区分显示的解决办法
1.右键Sessions,打开属性,如下图. 2.打开之后如下图所示. 3.点击外观,如图所示. 4.修改颜色方案为Traditional. 5.修改之后的结果,可以明显的区分文件与文件夹的类型,如图 ...
- android曲面屏点击事件无响应,都说曲面屏中看不中用,主要原因有四点,第三点是关键!...
都说曲面屏中看不中用,主要原因有四点,第三点是关键! 2020-11-17 11:29:39 0点赞 0收藏 0评论 回归纯平屏幕的iPhone 12发布后,那些直屏党用户的呼声更高了,而上一次还是在 ...
- android String文件中修改部分字体颜色
修改部分字体颜色各位同学都知道可以使用SpannableStringBuilder,其实我们可以还有别的简单方式配合Html.fromHtml() 方案一:用SpannableStringBuilde ...
- 设置TextView中超链接字体颜色、下划线
ClickableSpan:这是超链接相关的样式控制和点击事件的控制类,我们需要对它进行继承,然后修改成我们需要的样式.其中,可以对超链接文本字符进行颜色.字体大小.字体.下划线.点击事件的自定义控制 ...
- android TextView设置字体颜色
今天,简单讲讲如何设置TextView的字体颜色. 其实很简单,不过之前忘记了,所以还是记录,总结一下. TextView的字体设置方法: 1.直接通过配置文件设置 2.在Activity类中进行设置 ...
- android textview 字体颜色设置,Android textview 设置不同的字体大小和颜色
在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...
- android+设置字体行高,android textview设置字体的行距和字间距
android textview设置字体的行距和字间距 字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView ...
最新文章
- easyui 页面加载闪现问题 解决方法
- 【程序员的英语】出奇制胜-那你得乖乖学英语啊!
- linux 中使用 crontab 执行定时任务
- IO流常用的体系结构
- kafka拉取mysql数据库_kafka里信息用flink获取后放入mysql
- 上传图片并显示缩略图的最简单方法(c#)
- 电脑主板接口_如何看电脑主板 M.2 接口是支持 SATA 还是 NVMe 固态硬盘?
- zabbix_nginx监控
- 白话空间统计二十四:地理加权回归(六)ArcGIS的GWR工具参数说明一
- C语言的源代码文件、目标文件和可执行文件
- Mars《Android开发视频教程》
- h5扫描pc端二维码登录
- EFM32芯片jlink无法连接,无法调试,解锁流程
- 你还在担心黑客攻击吗?所有程序员都应该掌握的基础网络安全知识,快进来看看吧
- 软件工程——经验软件工程概述
- 微信红包雨怎么抢_微信红包雨怎么发出? 微信红包雨发送技巧有哪些?
- Flappy Bird引爆山寨应用热:谁火我就模仿谁
- OEM、ODM别再混淆了,TCOOP教您轻松辨别
- Linux centos 64位 mysql安装教程
- JAVA大数据(一)简介-Hadoop环境配置,伪分布式模式架构学习用
热门文章
- 统计推断(九) Graphical models
- ObjectBox[八] 关系
- python traceback安装_python之traceback
- 网站安全服务应该如何安全储存用户数据
- php如何做服务器,如何用php实现一个web服务器
- 地砖设计 贪心、字符串
- python正则表达式贪婪匹配_Python正则表达式教程之三:贪婪/非贪婪特性
- python 求 gamma 分布_Python stats.gamma方法代码示例
- 2022-2027年中国苦荞茶饮料行业发展前景及投资战略咨询报告
- NEC成功完成对Avaloq的收购