Ответ 1
Вы можете использовать это:
TextUtils.concat(span1, span2);
http://developer.android.com/reference/android/text/TextUtils.html#concat(java.lang.CharSequence...)
Я разделяю 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);
Как я могу это сделать? Я не нашел требуемый метод или конструктор для этого.
Вы можете использовать это:
TextUtils.concat(span1, span2);
http://developer.android.com/reference/android/text/TextUtils.html#concat(java.lang.CharSequence...)
Спасибо, он работает. Я заметил, что я могу объединить даже 3 spannable объекта:
(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) }
}
Надеюсь, это может кому-нибудь помочь.
Как сказано в комментарии 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
не беспокоясь о потере любого из стилей и форматирования, которые у вас есть!
Обратите внимание, что это будет работать для большинства стилей, оно работает не всегда, но должно быть достаточно, чтобы охватить все основные стили.