Android SpannableString的变色、点击以及点击后的背景色的问题

开发小知识记录

一段文本分成多段可点击且颜色不一样,实现技巧如下:

kotlin 复制代码
val text = getString(R.string.cancel_account_protocol)
val spannableString = SpannableString(text)

//设置点击前面的字的响应
val clickableSpan1 = object : ClickableSpan() {
override fun onClick(widget: View) {
        //前半部分点击事件
    }
    override fun updateDrawState(ds: TextPaint) {
        ds.color = ContextCompat.getColor(requireActivity(),R.color.color_40black)   //1
        ds.isUnderlineText = false   //2
    }

}
spannableString.setSpan(
    clickableSpan1,
    0,
    text.length - 6,
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE
)

// 设置点击后面的字的响应
val clickableSpan2 = object : ClickableSpan() {
    override fun onClick(widget: View) {
        //后半部分点击事件
    }

    override fun updateDrawState(ds: TextPaint) {
        ds.color = ContextCompat.getColor(requireActivity(),R.color.color_07c160)
        ds.isUnderlineText = false
    }
}
spannableString.setSpan(
    clickableSpan2,
    text.length - 6,
    text.length,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

binding.tvProtocol.movementMethod = LinkMovementMethod.getInstance()   //3
binding.tvProtocol.text = spannableString  
binding.tvProtocol.highlightColor = ContextCompat.getColor(requireActivity(),android.R.color.transparent)   //4

注意点一:

变色不是通过ForegroundColorSpan实现的,而是注释1处实现的

注意点二:

去除下划线是重写updateDrawState方法,将isUnderlineText设置为false实现的,见注释2处。

注意点三:

ClickableSpan点击会有选中背景的效果,如果想要清除需要设置TextView的highlightColor为透明色,代码中注释4处。最后不要忘记在设置spannableString之前设置LinkMovementMethod.getInstance(),见注释3处。

看一段具体的UI效果:

相关推荐
AFinalStone10 小时前
Android 7系统休眠唤醒(六)唤醒全链路
android·电源管理·休眠唤醒
雨白11 小时前
深入理解 Kotlin 协程 (九):互通有无,解构 Channel 缓冲策略与底层无锁机制
android·kotlin
灯塔@kuaidao12 小时前
平台交叉编译名词解释与基础流程
android
__Witheart__13 小时前
3568 Android otg模式下adb热拔插不识别
android·adb·rockchip
明天…ling15 小时前
Upload-Labs (Pass1-Pass21) 完整通关思路与源码分析
android·网络安全·渗透测试·burpsuite·upload-labs·文件上传绕过·靶场复现
__Witheart__15 小时前
3568 Android ntp校时使用
android·rockchip
wddptwd2816 小时前
android studio 报错怎么处理 java.lang.NullPointerException
android·java·android studio
美狐美颜SDK开放平台16 小时前
直播APP开发,美颜SDK和相机SDK有什么区别?
android·深度学习·数码相机·ios·直播美颜sdk·视频美颜sdk
唐诺18 小时前
Android Open Accessory (AOA) 协议完全解析
android·usb·aoa
我命由我1234519 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio