Подтвердить что ты не робот

Как объединить несколько spannable объектов?

Я разделяю spannable-объект на 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);            

Как я могу это сделать? Я не нашел требуемый метод или конструктор для этого.

4b9b3361

Ответ 2

Спасибо, он работает. Я заметил, что я могу объединить даже 3 spannable объекта:

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

Ответ 3

Я знаю, что это старый. Но после небольшого изменения 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) }
}

Надеюсь, это может кому-нибудь помочь.

Ответ 4

Как сказано в комментарии TextUtils.concat, использование 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 не беспокоясь о потере любого из стилей и форматирования, которые у вас есть!

Обратите внимание, что это будет работать для большинства стилей, оно работает не всегда, но должно быть достаточно, чтобы охватить все основные стили.