1

我正在制作一个需要文本格式功能的应用程序,例如将所选文本设为粗体、斜体、删除线、下划线等。我使用了 StyleSpan(Typeface.BOLD)、StyleSpan(Typeface.Italic)、UnderlineSpan()、 StrikethroughSpan() 由 android 提供。所有这些都工作正常。但是,当我尝试在前一个跨度上应用一个新跨度时,先前应用的跨度将被删除并应用新的跨度。这是我用来根据按钮单击应用格式的功能:

  fun formatText(typefaceCode: StyleSpan = StyleSpan(Typeface.BOLD), isUnderline : Boolean = false, isStrikeThrough : Boolean = false, isQuote : Boolean = false){
            val selectionStart: Int = mEditTextNoteContent.selectionStart
            val selectionEnd: Int = mEditTextNoteContent.selectionEnd
            val selectedText: String = mEditTextNoteContent.text.toString().substring(selectionStart, selectionEnd)
            val formattedString = SpannableStringBuilder(selectedText)
            when {
                isUnderline -> formattedString.setSpan(UnderlineSpan(), 0, selectedText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
                isStrikeThrough -> formattedString.setSpan(StrikethroughSpan(), 0, selectedText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
                isQuote -> mEditTextNoteContent.text.replace(selectionStart, selectionEnd,  "\"" + selectedText + "\"")
                else -> formattedString.setSpan(typefaceCode, 0, selectedText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }
            if(!isQuote)
                mEditTextNoteContent.text.replace(selectionStart, selectionEnd, formattedString)
 }

最初,我有以下格式用粗体和删除线格式化 然后,我选择了整个文本并应用了粗体。它应该将所有内容与以前格式中的删除线一起显示为粗体,但它没有发生。这是正在发生的事情:文本变为粗体,但删除了删除线。

4

2 回答 2

1

问题是在 EditText 上使用 replace()。您必须使用 editText.setSpan() 方法,而不是使用 replace()。

因此,更新后的代码如下所示:

fun formatText(typefaceCode: StyleSpan = StyleSpan(Typeface.BOLD), isUnderline : Boolean = false, isStrikeThrough : Boolean = false, isQuote : Boolean = false, isBulletSpan : Boolean = false){
    val selectionStart: Int = mEditTextNoteContent.selectionStart
    val selectionEnd: Int = mEditTextNoteContent.selectionEnd
    val selectedText: CharSequence = TextUtils.substring(mEditTextNoteContent.text, selectionStart, selectionEnd)
    when{
        isUnderline -> mEditTextNoteContent.text.setSpan(UnderlineSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        isStrikeThrough -> mEditTextNoteContent.text.setSpan(StrikethroughSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        isQuote -> mEditTextNoteContent.text.replace(selectionStart, selectionEnd,  "\"" + selectedText + "\"")
        else -> mEditTextNoteContent.text.setSpan(typefaceCode, selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
}

这不会覆盖以前使用的 Span

于 2020-04-11T10:37:32.387 回答
0
        val selectedText: String = mEditTextNoteContent.text.toString().substring(selectionStart, selectionEnd)

toString()消除跨度,因为您特别要求它切换到Stringfrom CharSequence

用于TextUtils.substring()直接使用CharSequence. 它可能会导致类似的结果:

        val selectedText: CharSequence = TextUtils.substring(mEditTextNoteContent.text, selectionStart, selectionEnd)
于 2020-04-10T17:13:37.637 回答