You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除CheckBox文本中添加的Spannable删除线格式?

移除CompoundButton文本中的删除线Spannable格式

嘿,针对你用CheckBox做勾选加删除线、取消时要移除格式的需求,我有两个实用的方案,刚好适配你的场景:

方案一:精准移除StrikethroughSpan

如果不想额外存储原始文本,可以直接从当前的Spannable内容里定位并删除所有删除线样式,还不会影响其他可能存在的Span格式:

fun CompoundButton.removeStrikeThrough() {
    val currentText = text
    if (currentText is Spannable) {
        // 获取文本中所有的删除线Span
        val strikeSpans = currentText.getSpans(0, currentText.length, StrikethroughSpan::class.java)
        // 逐个移除
        strikeSpans.forEach { span ->
            currentText.removeSpan(span)
        }
    }
}

使用时,在CheckBox的onCheckedChangeListener里,当isChecked为false时调用这个方法就行,它会干净利落地去掉删除线。

方案二:保存原始文本,一键恢复

如果你的场景只是单纯的勾选切换删除线,这种方法会更直观,避免操作Span的繁琐:
我们可以给CompoundButton加个扩展属性来存原始的无格式文本,初始化时保存,需要恢复时直接用:

// 用委托给CompoundButton添加一个存储原始文本的属性
private var CompoundButton.originalText: CharSequence? by Delegates.notNull()

fun CompoundButton.setupStrikeToggle() {
    // 初始化时先把原始文本存起来
    originalText = text
    setOnCheckedChangeListener { button, isChecked ->
        if (isChecked) {
            // 勾选时添加删除线
            val spanText = SpannableString(originalText)
            spanText.setSpan(
                StrikethroughSpan(), 0, originalText?.length ?: 0, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            button.text = spanText
        } else {
            // 取消时直接恢复原始文本,自动移除所有Span格式
            button.text = originalText
        }
    }
}

使用时,只需要给你的每个CheckBox调用setupStrikeToggle(),就能自动处理勾选/取消的样式切换,逻辑清晰还不容易出错。

小提示

你之前用SpannableString的思路很赞,因为它支持给部分文本加删除线。如果之后需要给部分文本切换删除线,方案一的思路可以扩展:只移除指定范围内的StrikethroughSpan就行,灵活性拉满。

内容的提问来源于stack exchange,提问作者methodsignature

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:04