本文主要是介绍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 富文本 点击变色、事件传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!