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 ). Вы должны иметь дело с этим.


JavaDoc SpannableString :

Это класс для текста, контент которого неизменен, но к которым могут быть прикреплены и отсоединены объекты разметки. Для изменяемого текста см. SpannableStringBuilder.

Поэтому, если текст должен быть SpannableStringBuilder , используйте SpannableStringBuilder вместо SpannableString . Вы также не можете использовать replaceRange , потому что это возвращает CharSequence чего обычно не SpannableStringBuilder , но SpannableStringBuilder также использует методы replace .