Android 富文本 点击变色、事件传递

2024-06-19 03:38

本文主要是介绍Android 富文本 点击变色、事件传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发语言为Kotlin,还在使用java的小朋友,不妨试试

在android中富文本的使用近乎频繁了,网上资料颇多,手上刚好在做一个带有圈子模块的项目

在这里插入图片描述

贴代码:

自定义类 DefaultClickSpan.kt
import android.support.v4.content.ContextCompat
import android.text.TextPaint
import android.text.style.ClickableSpan
import android.view.View
import android.widget.TextView
import com.qiufeng.educationteacher.R
import com.qiufeng.educationteacher.application.App
import com.qiufeng.educationteacher.ui.listener.ClickListener
import io.reactivex.Flowable
import java.util.concurrent.TimeUnitclass DefaultClickSpan(val params: Any? = null,val listener: ClickListener? = null,val color: Int = -1
) : ClickableSpan() {override fun updateDrawState(ds: TextPaint?) {super.updateDrawState(ds)ds?.let {// 点击文本颜色it.color = RUtils.getColor(if (color == -1) R.color.color_blue_grey else color)// 去除下划线it.isUnderlineText = false}}override fun onClick(widget: View?) {widget?.let {if (it is TextView) {// 点击时,被点击区域的背景色it.highlightColor = RUtils.getColor(R.color.color_grey)// 启动一个延时任务,200毫秒后恢复区域颜色Flowable.timer(200, TimeUnit.MILLISECONDS).doOnComplete {(widget as TextView).highlightColor = RUtils.getColor(R.color.color_transparent)}.subscribe()}// 点击区域时需要传递的参数if (params != null && listener != null) {listener.onClick(params)}}}
}
点击事件监听 ClickListener.kt
interface ClickListener {fun onClick(any:Any)
}
工具类 RUtils.kt
class RUtils {companion object {/*** 获取资源颜色色值* @param rId*/fun getColor(rId: Int): Int {return ContextCompat.getColor(App.context, rId)}}
}
Span工具类:SpannedUtils.kt
class SpannedUtils {companion object {/*** 拼接点击Span* @param sb 拼接源* @param clickStr 需要拼接的点击文字* @param params 点击事件响应返回的数据* @param color 拼接字符的前景色* @param clickListener 点击事件监听*/fun appendClickableSpan(sb: SpannableStringBuilder,clickStr: String,params: Any? = null,color: Int = -1,clickListener: ClickListener? = null) {val oldLength = sb.lengthsb.append(clickStr)sb.setSpan(DefaultClickSpan(params, clickListener, color), oldLength, sb.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)}}
}
前端页面调用(使用数据为类似点赞人列表)
private fun setText(list:MutableList<String>){val sb = SpannableStringBuilder()val length = list.size(0 until length){SpannedUtils.appendClickableSpan(sb,list[it],list[it],object:ClickListener{override fun onClick(any: Any) {showToast(any.toString())      }})}// 颜色、回传参数、监听可以不加// SpannedUtils.appendClickableSpan(sb,list[it])tvHeart.text = sb// 这句很重要,否则点击无效tvHeart.movementMethod = LinkMovementMethod.getInstance()
}
发现一个重要问题:

在设置点击事件的时候,如果涉及到页面的跳转等UI操作,可能会产生一个bug:

Only the original thread that created a view hierarchy can touch its views

错误提示:(有道词典)只有创建了视图层次结构的原始线程才能访问它的视图;跨线程修改UI的问题

解决: 修改DefaultClickSpan类

将点击事件做一下延迟就好,可以用上面的Flowable.timer,延迟事件跟 恢复背景色的时间一致就可以

// 部分代码
if (params != null && listener != null) {Flowable.timer(200, TimeUnit.MILLISECONDS).doOnComplete {listener.onClick(params)}.subscribe()
}

注释应该够了,可有帮助?

这篇关于Android 富文本 点击变色、事件传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073904

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级