Android Kotlin`.replaceRange`不会替换SpannableString中的文本

我的Android应用程序使用ClickableSpan处理扰流标签。 我想在TextView为它实现文本替换,但是.replaceRange什么都不做。 我可以确认startPosendPos是有效的位置。

  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 

因为

 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方法。