SpannableStringBuilder 类的remove 属性到底如何工作? Android 中的文本编辑器 (Kotlin)

问题描述 投票:0回答:1

我正在使用 Kotlin 开发一个小型原生 Android 项目。我打算创建一个小型文本编辑器,其中包含粗体、斜体、下划线等各种按钮。不幸的是我已经努力好几天了;我也在做研究并质疑人工智能,但我无法弄清楚。我不明白 SpannableStringBuilder 类的删除属性是如何工作的。

让我们从一个简单的想法开始,我还将包含其中的代码:我有一个按钮和一个 EditText。当您按下该按钮时,后续字符将带有下划线。当您再次按下按钮时,后续字符的下划线应该消失。

    val editTextContent : EditText = findViewById(R.id.editTextContent)


    val btnUnderline: Button = findViewById(R.id.button)
    var isUnderlineApplied = false

    btnUnderline.setOnClickListener {



        val startSelection = editTextContent.selectionStart
        val endSelection = editTextContent.selectionEnd

        val spannableString = SpannableStringBuilder(editTextContent.text)

        if (isUnderlineApplied) {

            // Remove the underline

            spannableString.removeSpan(UnderlineSpan())
        } else {
            // Apply underlining

            spannableString.setSpan(
                UnderlineSpan(),
                startSelection,
                endSelection,
                Spannable.SPAN_INCLUSIVE_INCLUSIVE
            )

        }
        
        editTextContent.text = spannableString
        editTextContent.setSelection(endSelection)

        isUnderlineApplied = !isUnderlineApplied


    }

这不会发生在这里。我不懂为什么。我还尝试制作一个全新的项目,认为有一些设置插入不正确,但什么也没有。这就是为什么我问你,这个去除剂是如何工作的,我应该做什么才能使它正常工作?感谢您的关注。

android kotlin android-edittext editor spannablestringbuilder
1个回答
0
投票

问题出在以下行:

spannableString.removeSpan(UnderlineSpan())

您想要从字符串生成器中删除一个跨度,但是此行创建了一个字符串中不存在的new跨度,因此什么也没有发生。

Here 是如何从字符串中检索跨度并删除它们的示例。您还可以仅捕获使用

setSpan
代码创建的下划线范围,并在稍后引用它以进行删除。

© www.soinside.com 2019 - 2024. All rights reserved.