2017-07-19 21 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

try 'Editable#replace' – pskink

+0

@pskinkどのようにしてEditableにキャストできますか? – Feelfree

+0

あなたと同じように? 'var text =((TextViewとしてのTextView).textをSpannableStringとして)' – pskink

答えて

1

text.replaceRange(startPos, endPos, spoilerText) 

は何もしませんので。あなたは決して使用しない新しいObjectを返します。メソッドのドキュメントを参照してください。あなたのケースであるよりも、

val newText = text.replaceRange(startPos, endPos, spoilerText) 

戻り値の型CharSequencehttps://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/replace-range.htmlを参照してください):それはあなたのような使用すべき新しいオブジェクトを返します。あなたはそれに対処しなければなりません。 SpannableString


Javadocは:

これはコンテンツ不変であるが、これに マークアップオブジェクトが着脱可能なテキストのクラスです。可変テキストについては、 SpannableStringBuilderを参照してください。

テキストを変更可能にする必要がある場合は、SpannableStringではなくSpannableStringBuilderを使用してください。 replaceRangeのいずれかを使用することはできません。これは通常、何が何が欲しいのではないかCharSequenceを返しますが、SpannableStringBuilderreplaceのメソッドを持っています。

+0

ですが、 textViewにまたがっています。 text.replaceRangeによって返された裸の文字列でテキストを置き換えると、マークアップは消えます – Feelfree

+1

これはオプションではありません。 'replaceRange'は、常に新しいオブジェクトを返す不変の操作です。その場合は、@ pskinkが提案した方法で行ってください。 – guenhter

関連する問題