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

相关文章

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo