web-dev-qa-db-ja.com

一部のスパン可能なオブジェクトをマージするにはどうすればよいですか?

スパン可能なオブジェクトを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);            

どうすればできますか?それを行うために必要なメソッドまたはコンストラクターが見つかりません。

61
Eugene

あなたはこれを使うことができます:

TextUtils.concat(span1, span2);

http://developer.Android.com/reference/Android/text/TextUtils.html#concat(Java.lang.CharSequence ...)

140
xil3

ありがとう、うまくいきました。 3つのスパン可能なオブジェクトでもマージできることに気づきました。

(Spanned) TextUtils.concat(foo, bar, baz)
20
Eugene

私はこれが古いことを知っています。しかし、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) }
}

それが誰かを助けることを願っています。

1
AlexKost

MarwinXXIIがコメントで言ったように、TextUtils.concatは機能しますが、単一のCharSequenceに同じスパンの複数のインスタンスがある場合、スタイルが失われることがあります。

回避策は、CharSequenceParcelに書き込んでから、それを読み取ることです。以下にこれを行う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スタイルで機能することに注意してください。常に機能するわけではありませんが、すべての基本的なスタイルをカバーするには十分です。

0
nulldev