首先Span是什么
Span是功能强大的标记对象,可用于在字符或段落级别的文本设置样式。我们可以将该标记对象添加到文本上,从而可以改变文本的颜色,使文本可点击,缩放文本大小等等。

创建Span
创建一个Span,可以使用以下三个类
SpannedString  使用该类创建的Span对象不可以改变文本,不可以改变标记。很少使用到。
SpannableString  使用该类创建的Span对象不可改变文本,可以改变标记,一般在不修改文本内容,只修改文本标记的情况下(比如修改文本的颜色等)应该使用该类。
SpannableStringBuilder  使用该类创建的Span对象可以改变文本,可以改变标记,一般在要修改文本内容时使用,如果需要将大量的Span附加到文本上,那不管是否修改文本,都应该使用该类。

应用Span
如果需要应用Span,需要对Spannable对象调用setSpan(Object _what_, int _start_, int _end_, int _flags_)。参数what代表要应用于文本的Span,start和end表示要应用该Span的文本位置(前包括后不包括,要对整个文本应用Span,start为0,end为文本长度)
在应用Span后,如果在Span边界内插入文本,则Span会自动扩展已插入的文本,如果在Span的边界上(即在start或end索引处)插入文本时。flags参数表示是否应该将Span扩展到插入的文本上。
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 标志表示会排除插入的文本
Spannable.SPAN_EXCLUSIVE_INCLUSIVE 标志表示会包含插入的文本

常用的Span
ForegroundColorSpan
可用于改变文本颜色

val spannable = SpannableString("只要学不死,就往死里学!")
spannable.setSpan(ForegroundColorSpan(Color.RED),0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable

BackgroundColorSpan 可用于改变文本的背景颜色

val spannable = SpannableString("只要学不死,就往死里学!")
spannable.setSpan(BackgroundColorSpan(Color.RED),0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable

UnderlineSpan 可用于给文本添加下划线

val spannable = SpannableString("只要学不死,就往死里学!")
spannable.setSpan(UnderlineSpan(),0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable

ClickableSpan 可用于给文本添加点击事件

private val clickableSpan = object : ClickableSpan() {override fun onClick(widget: View) {Toast.makeText(this@MainActivity, "clickableSpan", Toast.LENGTH_SHORT).show()}override fun updateDrawState(ds: TextPaint) {//clickableSpan默认的文本有字体颜色和下划线//可重写此方法改变默认行为ds.isUnderlineText = false}
}
val spannable = SpannableString("只要学不死,就往死里学!")
spannable.setSpan(clickableSpan,0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable
//默认的clickableSpan点击后会高亮,设置textView的highlightColor属性来消除高亮
textView.highlightColor = ContextCompat.getColor(this, android.R.color.transparent)
//设置movementMethod后才有真正的有点击事件
textView.movementMethod = LinkMovementMethod.getInstance()

在使用ClickableSpan时,可能会遇到几个问题.。
一.如果在使用ClickableSpan的同时为TextView添加上点击事件,在点击Span的区域时,会同时触发两个回调事件。这是因为TextView的onTouchEvent()会首先调用super.onTouchEvent()。然后才会调用我们的mMovement.onTouchEvent()。由于View的onClick事件会被post到主线程调用。有一定的延迟。所以Span的点击事件会优先于View的onClick事件。我们可以设置一个标志位。来过滤掉View的onClick事件

//设置标志位来过滤事件
var isClickSpan = falsetextView = findViewById(R.id.textView)
textView.setOnClickListener {//如果span的点击事件没触发if(!isClickSpan) {Log.d("TAG",  "textView")}//重置标志位isClickSpan = false
}private val clickableSpan = object : ClickableSpan() {override fun onClick(widget: View) {//更改标志位isClickSpan = trueLog.d("TAG", "clickableSpan")}
}val spannable = SpannableString("只要学不死,就往死里学!")
spannable.setSpan(clickableSpan,0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()

二.如果为一个TextView添加上ClickableSpan,则不管点击的是不是Span区域。TextView都会默认消耗掉此次事件。这样会导致该TextView所在的ViewGroup接收不到事件回调。因为默认事件都被TextView消耗掉了。我们可以重写LinkMovementMethod的onTouchEvent()

class CustomLinkMovementMothod : LinkMovementMethod() {companion object {private var instance: CustomLinkMovementMothod? = nullget() {if (field == null) {field = CustomLinkMovementMothod()}return field}@JvmStaticfun get() : CustomLinkMovementMothod {return instance!!}}override fun onTouchEvent(widget: TextView?, buffer: Spannable?, event: MotionEvent?): Boolean {val b =  super.onTouchEvent(widget, buffer, event)if (!b && event?.action == MotionEvent.ACTION_UP) {val viewParent = widget?.parentif (viewParent is ViewGroup) {//显示的调用performClick//来触发onClick的回调viewParent.performClick()}}return b}
}

重复利用Span
当我们使用setText()重载时,TextView会创建Spannable的副本作为SpannedString,并将其作为CharSequence保存在内存中。这意味着文本和Span不可变。而当我们需要更新文本或Span时,会需要创建一个新的Spannable对象并再次调用setText()。
如果表示我们创建的Span可变。可调用setText(CharSequence text, TextView.BufferType type)

textView.setText(spannable, TextView.BufferType.SPANNABLE)
val spannableText = textView.text as Spannable
spannableText.setSpan(BackgroundColorSpan(Color.RED),0,6,Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)

现在,当附加,分离,或重新定位Span时,TextView会自动更新来反映对文本的更改。

Android TextView的各种Span相关推荐

  1. android span字体修改,Android TextView使用SpannableString设置复合文本的方法详解

    本文实例讲述了Android TextView使用SpannableString设置复合文本的方法.分享给大家供大家参考,具体如下: TextView通常用来显示普通文本,但是有时候需要对其中某些文本 ...

  2. android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片...

    一:TextView组件改变部分文字的颜色: 1.TextView textView = (TextView)findViewById(R.id.textview); 2. 3.//方法一: 4.te ...

  3. 使用Kotlin的Android TextView –全面教程

    Kotlin is the official programming language for Android apps development. In this tutorial, we'll be ...

  4. 安卓直接展示html,Android textView展示html图片,实现图文混排,点击查看大图片

    Android textView展示html图片,实现图文混排,点击查看大图片 最近要展示html在textView上,实现图文混排,并且图片可以点击放大,所以去研究了一下,效果图如下: 我们知道te ...

  5. Android TextView 实现一个单词分两行显示

    今天遇到一个需求,TextView实现自动换行时一个英文单词能够换行显示,使布局整齐.通过网上查询,确定实现逻辑如下: 自定义TextView,重写其onMeasure方法,在测量textView的宽 ...

  6. Android -- TextView与EditText 同步显示

    Android -- TextView与EditText 同步显示 文章分类:JavaEye 方法一.利用View.OnKeyListener"同步"显示         Java ...

  7. Android TextView中设定个别文字字体显示格式

    Android TextView中设定个别文字字体显示格式 文章分类:移动开发 用Html来格式化字符,例如要实现如下的显示: "这只是一个测试字符串,测试黑体字.斜体字.下划线.红色字的显示." 可 ...

  8. Android TextView中图文混排设置行间距导致高度不一致问题解决

    Android TextView中图文混排设置行间距导致高度不一致问题解决 参考文章: (1)Android TextView中图文混排设置行间距导致高度不一致问题解决 (2)https://www. ...

  9. android 怎么加链接地址,Android TextView添加超链接的方法示例

    本文实例讲述了Android TextView添加超链接的方法.分享给大家供大家参考,具体如下: public class Link extends Activity { @Override prot ...

最新文章

  1. iOS10 UI教程基改变视图的外观与视图的可见性
  2. ASP:FileSystemObject处理文件
  3. Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析
  4. AllsitePasswd 全站密码访问插件 支持自定义主题模板
  5. 华盛顿大学研发PaperID技术,可在纸上印刷RFID电子标签
  6. stm32定时器编码器模式原理及配置
  7. 漫画:什么是基数排序?
  8. 软件工程系组织12级学生到工商学院参加比赛
  9. r语言 html 变为ppt,如何用R来定制个性化PPT
  10. Cesium-Fullscreen全屏显示
  11. Windows7 SP1旗舰版精简版最终版本
  12. axure元件制作-常用开关
  13. 怎样缓解灾难性遗忘?持续学习最新综述三篇
  14. 360搜索、UC浏览器等被3·15点名应用已下架;马斯克宣布通过NFT卖歌;美团App再发力社交,内测 “群聊”功能...
  15. 汽车的调谐器技术-Tuner
  16. Selenium浏览器自动化测试工具
  17. 为什么女性朋友容易患上拇外翻?
  18. 【浙江大学C小程week6知识点整理】
  19. 缓存架构设计之——Redis集群搭建
  20. 金仓数据库 KingbaseES V8.3至V8.6迁移最佳实践(3. KingbaseES移植能力支撑体系)

热门文章

  1. inline(内联函数)优缺点比较
  2. Daniel Cremers TED演讲
  3. 实验篇---MPLS v+p+n + OSPF sham-link
  4. Windows 临界区(CRITICAL_SECTION)的使用
  5. 数据库实验报告【太原理工大学】
  6. 个人云平台 Sandstorm
  7. PT100与PT1000热敏电阻区别
  8. 电脑上怎么清空我的android手机,缓存数据可以清除吗?手机与电脑清除方法详解...
  9. 丰田汽车制造“厨房”的主力军——TOYOPUC
  10. office 部署安装