如何使用按钮单击删除 UnderlineSpan() 文本

How to remove UnderlineSpan() text using button click

我正在尝试创建一个小型记事本项目。现在我很难找到一个解决方案来删除文本上的下划线。我可以设置它,但我不能删除它。

这是我的代码:

我是这样设置的

我使用span获取选中的文本

selectedString.setSpan(UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

这是我尝试取消设置的方法

selectedString.setSpan(UnderlineSpan().updateDrawState(TextPaint().apply { isUnderlineText = false }), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

我试图寻找解决方案,但运气不好,有人可以帮助我吗?提前致谢!

你可以像这样声明一个class

class NoUnderlineSpan : UnderlineSpan() {
    override fun updateDrawState(ds: TextPaint) {
        ds.color = ds.linkColor
        ds.isUnderlineText = false
    }
}

然后像使用 UnderlineSpan 一样使用 NoUnderlineSpan

或者你可以试试我写的这个库:SpannableStringDslExtension

如果您想删除 text 的所有样式,您可以只在 spannable 上使用 toString(),它会删除所有内容。

如果您只想删除 spannable 的一部分的样式,只需将 UnderlineSpanoverrideanonymous object 设为 updateDrawState方法

val underlineRemoveSpan = object : UnderlineSpan() {
    override fun updateDrawState(ds: TextPaint) {
        ds.isUnderlineText = false
    }
}

selectedString.setSpan(underlineRemoveSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

selectedString.setSpan(UnderlineSpan().updateDrawState(TextPaint().apply { isUnderlineText = false }), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

这不起作用,因为在将 isUnderlineText 设置为 false 后使用新的 TextPaint 调用 updateDrawStateUnderlineSpan class 中 updateDrawState 的实现,将其设置为 true,这就是下划线未被删除的原因。