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效果:

相关推荐
恋猫de小郭14 分钟前
Firebase 如何让全球 Android 和 Flutter 开发者集体 Build Fail
android·前端·flutter
我命由我1234532 分钟前
Android Camera - 获取当前设备屏幕的旋转角度、保存帧到外部存储的私有空间
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
DogDaoDao1 小时前
HarmonyOS 深度解析:从微内核到 ArkTS 工程实战
android·linux·ios·华为·程序员·harmonyos·harmonyos next
小成很成10 小时前
mysql 8.0.21 升级 mysql 8.0.45(经过生产环境验证)
android·mysql·adb
虎王物联14 小时前
PHP实现MQTT消息处理:物联网设备数据接收与指令下发
android·物联网·php
我命由我1234515 小时前
Android 开发 - 获取当前设备屏幕的旋转角度
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
程序员-Benothing16 小时前
MySQL 索引下推是什么?——深入理解 ICP 原理与实践
android·数据库·mysql
怀化纱厂球迷17 小时前
百度地图--android接入百度地图导航
android
AFinalStone17 小时前
Android 7系统无障碍服务(四)AccessibilityEvent 的产生与投递
android·无障碍服务