使用扩展函数为 AppCompatTextView 提供了多段文本点击区域设置功能

使用 Kotlin 扩展函数为 AppCompatTextView 提供了多段文本点击区域设置功能,允许在单个文本视图中设置多个可点击区域,每个区域可独立设置点击事件和文字颜色。

一、核心代码

1、ClickablePart 数据结构

kotlin 复制代码
data class ClickablePart(
    val targetText: String, // 需要高亮点击的文本
    val linkColor: Int? = null, // 高亮颜色
    val onClick: () -> Unit // 点击回调
)

1、扩展函数

kotlin 复制代码
import android.graphics.Color
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.hongtu.utils.entity.ClickablePart
import kotlin.collections.forEach

/**
 * 扩展函数:简化多段文本点击设置
 * @param fullText 全部文本
 * @param clickableParts 多段文本点击区域
 * @param linkColor 点击区域文字颜色
 */
fun AppCompatTextView.setMultiClickableSpan(
    fullText: String,
    clickableParts: List<ClickablePart>,
    linkColor: Int = R.color.utils_link_color
) {
    val spannable = SpannableStringBuilder(fullText)

    clickableParts.forEach { part ->
        val startIndex = fullText.indexOf(part.targetText)
        if (startIndex == -1) return@forEach

        val endIndex = startIndex + part.targetText.length

        // 设置点击事件
        spannable.setSpan(
            object : ClickableSpan() {
                override fun onClick(widget: View) = part.onClick()
                override fun updateDrawState(ds: TextPaint) {
                    ds.color = ds.linkColor
                    ds.isUnderlineText = false
                }
            },
            startIndex,
            endIndex,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )

        // 设置文字颜色
        spannable.setSpan(
            ForegroundColorSpan(part.linkColor?:ContextCompat.getColor(context, linkColor)),
            startIndex,
            endIndex,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }

    // 配置TextView
    movementMethod = LinkMovementMethod.getInstance()
    highlightColor = Color.TRANSPARENT
    text = spannable
}

二、使用示例

kotlin 复制代码
binding.tvAgreement.setMultiClickableSpan(
    fullText = "已阅读并同意《用户服务协议》、《个人信息保护政策》",
    clickableParts = listOf(
        ClickablePart(
            targetText = "已阅读并同意",
            onClick = {
                //选中CheckBox
            },
            linkColor = ContextCompat.getColor(this, R.color.design_white)
        ),
        ClickablePart(
            targetText = "《用户服务协议》",
            onClick = {
                //点击用户服务协议
            }
        ),
        ClickablePart(
            targetText = "《个人信息保护政策》",
            onClick = {
                //点击个人信息保护政策
            }
        )
    )
)

三、典型应用场景

  • 用户协议/隐私政策条款
  • 文本中的超链接
  • 可点击的免责声明
  • 动态生成的带操作提示文本
相关推荐
BreezeDove8 分钟前
【Android】AndroidStudio+Flutter开发建议环境变量
android·flutter
UXbot15 分钟前
移动端UI设计工具选型指南:iOS与Android设计标准支持对比
android·前端·低代码·ios·交互·团队开发·ui设计
Kapaseker26 分钟前
为什么 Java 要废弃 Thread.stop()?看完这篇你就懂了
android·kotlin
苦瓜花35 分钟前
【Android】三大动画的实践
android
Mars-xq41 分钟前
VSCode 开发 Android 时,类、方法无法跳转
android·ide·vscode
2601_961766641 小时前
【分享】Resprite安卓版|专业像素绘画,游戏美术创作工具
android·游戏美术
Mars-xq1 小时前
VSCode 开发Android 新手必装插件清单
android·ide·vscode
Wonderful U1 小时前
Python+Django实战|社区物业管理系统:业主档案、车位管理、物业费收缴、线上报修、投诉建议、园区公告、日常巡检
android·python·django
唐青枫1 小时前
Kotlin run 详解:把对象操作收进作用域,再把结果带出来
kotlin
三少爷的鞋2 小时前
现代 Android 官方为什么更推荐 Repository 暴露 `suspend fun`,而不是在内部 `launch`
android