Android中TextView文本高亮和点击行为的封装方法-创新互联

前言

十余年的靖安网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整靖安建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“靖安网站设计”,“靖安网站推广”以来,每个客户项目都认真落实执行。

相信大家应该都有所体会,对于一个社交性质的App,业务上少不了给一段文本加上@功能、话题功能,或者是评论上要高亮人名的需求。当然,Android为我们提供了ClickableSpan,用于解决TextView部分内容可点击的问题,但却附加了一堆的坑点:

  1. ClickableSpan 默认没有高亮行为,也不能添加背景颜色;
  2. ClickableSpan 必须配合 MovementMethod 使用
  3. 一旦使用 MovementMethod,TextView 必定消耗事件
  4. 当点击ClickableSpan时,TextView的点击也会随后触发
  5. 当press ClickableSpan 时, TextView的press态也会被触发

这些默认的表现会使得添加 ClickableSpan 后会出现各种不符合预期的问题,因此我们需要对其进行封装。

据个人使用经验,封装后应该能够方便开发实现以下行为:

  1. 让Span支持字体颜色和背景颜色变化,并且有press态行为
  2. Span的click或者press不影响TextView的click和press
  3. 可选择的决定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://scyanting.com/article/dsjohe.html