2017-07-19 36 views
0

我的Android應用程序使用ClickableSpan來處理擾流標籤。我試圖在TextView中實現文本替換,但.replaceRange什麼都不做。我可以確認startPosendPos是有效的職位。Android Kotlin`.replaceRange`不能替換SpannableString中的文本

 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 
+0

嘗試'可編輯#替換' – pskink

+0

@pskink如何將其轉換爲可編輯? – Feelfree

+0

就像你一樣? var text =((textView作爲TextView).text as SpannableString)' – pskink

回答

1

因爲

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:

這是文本,其內容是不變的,但到 標記對象可以安裝和拆卸的類。有關可變文本,請參閱 SpannableStringBuilder。

因此,如果文本必須是可變的,請使用SpannableStringBuilder而不是SpannableString。 您也不能使用replaceRange,因爲這會返回CharSequence通常不是人們想要的,但SpannableStringBuilder也有replace方法。

+0

但我想保留所有跨越textView。當我用text.replaceRange返回的純字符串替換文本時,標記將消失 – Feelfree

+1

比這不適合你。 'replaceRange'是一個永遠返回一個新對象的不可變操作。在這種情況下,您應該遵循@pskink建議的方式。 – guenhter