我的 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:
This is the class for text whose content is immutable but to which markup objects can be attached and detached. For mutable text, see SpannableStringBuilder.
因此,如果文本必须可变,请使用 SpannableStringBuilder
而不是 SpannableString
。
您也不能使用 replaceRange
,因为这会返回一个 CharSequence
这通常不是人们想要的,但 SpannableStringBuilder
也有 replace
方法。
关于java - Android Kotlin `.replaceRange` 不会替换 SpannableString 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191290/