【问题标题】:Android Kotlin `.replaceRange` does not replace text in SpannableStringAndroid Kotlin `.replaceRange` 不会替换 SpannableString 中的文本
【发布时间】:2017-07-20 13:52:39
【问题描述】:

我的 Android 应用程序使用ClickableSpan 来处理扰流标签。我正在尝试在TextView 中为它实现文本替换,但.replaceRange 什么也不做。我可以确认startPos 和endPos 是有效职位。

        var text = ((textView as TextView).text as SpannableString)
        var spans = text.getSpans(0, text.length, SpoilerSpan::class.java)
        for (span in spans) {
            if (span == this) {
                val startPos = text.getSpanStart(span)
                val endPos = text.getSpanEnd(span)

                printout(startPos.toString() + " " + endPos.toString())

                text.replaceRange(startPos, endPos, spoilerText)
                printout(text.toString())
            }
        }
        textView.text = text

【问题讨论】:

  • 试试Editable#replace
  • @pskink 如何将其转换为 Editable?
  • 和你一样吗? var text = ((textView as TextView).text as SpannableString)
  • @pskink java.lang.ClassCastException: android.text.SpannableString cannot be cast to android.text.Editable
  • SpannableString - 文档说:“这是内容不可变但可以附加和分离标记对象的文本类。对于可变文本,请参阅 SpannableStringBuilder。” 这里的关键词是 immutable

标签: java android textview kotlin


【解决方案1】:

因为

text.replaceRange(startPos, endPos, spoilerText)

什么都不做。它返回一个您从不使用的新对象。请参阅该方法的文档。它返回一个你应该使用的新对象:

val newText = text.replaceRange(startPos, endPos, spoilerText)

在您的情况下,返回类型为CharSequence(请参阅https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/replace-range.html)。你必须处理它。


SpannableString的JavaDoc:

这是文本的类,其内容是不可变的,但 标记对象可以附加和分离。对于可变文本,请参阅 SpannableStringBuilder。

因此,如果文本必须是可变的,请使用SpannableStringBuilder 而不是SpannableString。 您也不能使用replaceRange,因为这会返回CharSequence,这通常不是人们想要的,但SpannableStringBuilder 也有replace 方法。

【讨论】:

  • 但我想将所有跨度保留在 textView 中。当我用 text.replaceRange 返回的裸字符串替换文本时,标记将消失
  • 这不是你的选择。 replaceRange 是一个不可变的操作,它总是返回一个新对象。在这种情况下,您应该按照@pskink 建议的方式进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多