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