Android中TextView文本高亮和点击行为的封装方法-创新互联
前言
十余年的靖安网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整靖安建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“靖安网站设计”,“靖安网站推广”以来,每个客户项目都认真落实执行。相信大家应该都有所体会,对于一个社交性质的App,业务上少不了给一段文本加上@功能、话题功能,或者是评论上要高亮人名的需求。当然,Android为我们提供了ClickableSpan,用于解决TextView部分内容可点击的问题,但却附加了一堆的坑点:
- ClickableSpan 默认没有高亮行为,也不能添加背景颜色;
- ClickableSpan 必须配合 MovementMethod 使用
- 一旦使用 MovementMethod,TextView 必定消耗事件
- 当点击ClickableSpan时,TextView的点击也会随后触发
- 当press ClickableSpan 时, TextView的press态也会被触发
这些默认的表现会使得添加 ClickableSpan 后会出现各种不符合预期的问题,因此我们需要对其进行封装。
据个人使用经验,封装后应该能够方便开发实现以下行为:
- 让Span支持字体颜色和背景颜色变化,并且有press态行为
- Span的click或者press不影响TextView的click和press
- 可选择的决定TextView是否应该消耗事件
对于第三点,需要解释下TextView是否消耗事件的影响
用一张图来阐述下我们的目的。我们开发过程中,可能将点击事件加在TextView上,也可能将点击行为添加在TextView的父元素上,例如评论一般是点击整个评论item就可以触发回复。 如果我们把点击事件加在TextView的父元素上,那么我们期待的是点击TextView的绿色区域应该也要响应点击事件,但现实总是残酷的,如果TextView调用了setMovementMethod, 点击绿色区域将不会有任何反应,因为时间被TextView消耗了,并不会传递到TextView的父元素上。
那我们来一步一步看如何实现这几个问题。
首先我们定义一个接口 ITouchableSpan, 用于抽象press和点击:
public interface ITouchableSpan { void setPressed(boolean pressed); void onClick(View widget); }
本文标题:Android中TextView文本高亮和点击行为的封装方法-创新互联
路径分享:http://lswzjz.com/article/dsjohe.html