如何移除CheckBox文本中添加的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
相关产品推荐
相关产品推荐

