スパン可能なオブジェクトを3つの部分に分割し、さまざまな操作を実行してから、それらをマージする必要があります。
Spannable str = editText.getText();
Spannable selectionSpannable = new SpannableStringBuilder(str, selectionStart, selectionEnd);
Spannable endOfModifiedSpannable = new SpannableStringBuilder(str, selectionEnd, editText.getText().length());
Spannable beginningOfModifiedSpannable = new SpannableStringBuilder(str, 0, selectionStart);
どうすればできますか?それを行うために必要なメソッドまたはコンストラクターが見つかりません。
あなたはこれを使うことができます:
TextUtils.concat(span1, span2);
ありがとう、うまくいきました。 3つのスパン可能なオブジェクトでもマージできることに気づきました。
(Spanned) TextUtils.concat(foo, bar, baz)
私はこれが古いことを知っています。しかし、kotlin stdlibを少し変更した後、次のコードを取得しました。
fun <T> Iterable<T>.joinToSpannedString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): SpannedString {
return joinTo(SpannableStringBuilder(), separator, prefix, postfix, limit, truncated, transform)
.let { SpannedString(it) }
}
それが誰かを助けることを願っています。
MarwinXXIIがコメントで言ったように、TextUtils.concat
は機能しますが、単一のCharSequence
に同じスパンの複数のインスタンスがある場合、スタイルが失われることがあります。
回避策は、CharSequence
をParcel
に書き込んでから、それを読み取ることです。以下にこれを行うKotlin拡張コードの例:
fun CharSequence.cloneWithSpans(): CharSequence {
val parcel = Parcel.obtain()
TextUtils.writeToParcel(this, parcel, 0)
parcel.setDataPosition(0)
val out = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel)
parcel.recycle()
return out
}
このコードの使用例:
TextUtils.concat(*yourListOfText.map { it.cloneWithSpans() }.toTypedArray())
これで、あなたが持っているスタイルやフォーマットを失う心配をせずに、たくさんのCharSequences
を連結できます!
これはmostスタイルで機能することに注意してください。常に機能するわけではありませんが、すべての基本的なスタイルをカバーするには十分です。