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

标签 java android textview kotlin

我的 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:

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/

相关文章:

java - Java中使用TCP连接向多个客户端广播

android - 由于 ClassNotFoundException,无法构建 Android 应用程序

java - 如何迭代语句中的值?

android - TextView.getText().toString() 崩溃

Java 获取字节()

java - 如何使用 JAVA 将本地镜像而不是 URL 发送到 Microsoft Cognitive Face API

java - BufferedReader 由 HTTPClient 终止

android mediaplayer 问题播放 mp4

android - 过滤时自定义 ArrayAdapter 未更新

Android TextView 的背景在 TextView.Padding 更改时不动