Android Kotlin`.replaceRange`不会替换SpannableString中的文本
我的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
因为
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
方法。