我正在使用 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
}
这不会发生在这里。我不懂为什么。我还尝试制作一个全新的项目,认为有一些设置插入不正确,但什么也没有。这就是为什么我问你,这个去除剂是如何工作的,我应该做什么才能使它正常工作?感谢您的关注。
问题出在以下行:
spannableString.removeSpan(UnderlineSpan())
您想要从字符串生成器中删除一个跨度,但是此行创建了一个字符串中不存在的new跨度,因此什么也没有发生。
Here 是如何从字符串中检索跨度并删除它们的示例。您还可以仅捕获使用
setSpan
代码创建的下划线范围,并在稍后引用它以进行删除。