使用扩展函数为 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 = {
                //点击个人信息保护政策
            }
        )
    )
)

三、典型应用场景

  • 用户协议/隐私政策条款
  • 文本中的超链接
  • 可点击的免责声明
  • 动态生成的带操作提示文本
相关推荐
码农coding10 小时前
android12 开机动画分析
android
kango11 小时前
Xcode、模拟器Runtime、真机符号完整知识手册
ios·app
又见情义11 小时前
RK3568 Android 13 开机时间优化-禁用非必要系统服务
android
Android-Flutter11 小时前
Java Thread 和 Runnable 详解
android
mmsx12 小时前
osmdroid Overlay 体系详解:比例尺/罗盘/总绘图层有序叠放
android·源码·地图·osmdroid
又见情义13 小时前
RK3568 Android 13 开机时间优化-HAL 服务延时启动
android
v_348360876214 小时前
Android8 开机动画结束分析
android
美狐美颜SDK开放平台16 小时前
直播APP开发核心功能详解:美颜SDK、音视频、礼物等功能成本怎么计算?
android·人工智能·计算机视觉·音视频·直播美颜sdk
安河桥。16 小时前
Android视频流处理模块硬件加速器数据流转技术说明
android·图像处理·isp