Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Kotlin`.replaceRange`不替换SpannableString中的文本_Java_Android_Textview_Kotlin - Fatal编程技术网

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

Java Android Kotlin`.replaceRange`不替换SpannableString中的文本,java,android,textview,kotlin,Java,Android,Textview,Kotlin,我的Android应用程序使用ClickableSpan来处理扰流板标签。我试图在TextView中为它实现文本替换,但是.replaceRange什么都不做。我可以确认startPos和endPos是有效的位置 var text = ((textView as TextView).text as SpannableString) var spans = text.getSpans(0, text.length, SpoilerSpan::class.java)

我的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
(请参阅)。你必须解决这个问题


JavaDoc of
SpannableString

这是一个文本类,其内容是不可变的,但是 可以附着和分离标记对象。有关可变文本,请参见 Spannabestringbuilder

因此,如果文本必须是可变的,请使用
SpannableStringBuilder
而不是
SpannableString
。 您也不能使用
replaceRange
,因为它返回一个
CharSequence
通常不是您想要的,但是
SpannableStringBuilder
也有
replace
方法。

因为

text.replaceRange(startPos, endPos, spoilerText)
什么也不做。它返回一个您从未使用过的新对象。请参阅该方法的文档。它返回一个您应该使用的新对象,如:

val newText = text.replaceRange(startPos, endPos, spoilerText)
在您的案例中,返回类型为
CharSequence
(请参阅)。你必须解决这个问题


JavaDoc of
SpannableString

这是一个文本类,其内容是不可变的,但是 可以附着和分离标记对象。有关可变文本,请参见 Spannabestringbuilder

因此,如果文本必须是可变的,请使用
SpannableStringBuilder
而不是
SpannableString

你也不能使用
replaceRange
,因为这会返回一个
CharSequence
通常不是你想要的,但是
SpannableStringBuilder
也有
replace
方法。

试试
可编辑的#replace
@pskink我如何将它转换为可编辑的?就像你做的那样
var text=((textView作为textView.text作为SpannableString)
@pskink
java.lang.ClassCastException:android.text.SpannableString不能强制转换为android.text.Editable
SpannableString-文档说明:“这是一个文本类,其内容是不可变的,但标记对象可以附加和分离到该类。有关可变文本,请参见SpannableStringBuilder。“这里的关键字是immutabletry
Editable\replace
@pskink如何将其转换为可编辑?就像您所做的那样?
var text=((textView作为textView)。text作为SpannableString)
@pskink
java.lang.ClassCastException:android.text.SpannableString不能强制转换为android.text.Editable
SpannableString-文档说:“这是一个文本类,其内容是不可变的,但标记对象可以附加和分离。有关可变文本,请参见SpannableStringBuilder。“这里的关键词是不可变的,但我想在textView中保留我的所有跨度。当我将文本替换为text.replaceRange返回的裸字符串时,标记将不显示,因此您没有选择。
replaceRange
是一个始终返回新对象的不可变操作。在这种情况下,您应该按照@pskink建议的方式进行操作。但我希望将所有跨距都保留在textView中。当我将文本替换为text.replaceRange返回的裸字符串时,标记将不显示,因此您没有选择。
replaceRange
是一个始终返回新对象的不可变操作。在这种情况下,您应该按照@pskink建议的方式进行。