2011-01-05 4 views
35

Я разделяю spannable object на 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);    

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

ответ

99

Вы могли бы использовать это:

TextUtils.concat(span1, span2); 

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

+18

Иногда, не очень часто, Java упрощает работу. Я люблю те времена. +1 – Madbreaks

+0

@Madbreaks это не связано с Java, а с Android API. Это также можно сделать легко на C++. –

+4

В моем случае этот метод имел некоторые проблемы: 'TextUtils.concat (span1," ", span2);' style (ie span) для span1 исчез, осталось только его строковое представление. Обертка "" в Spanned не помогла. – marwinXXII

15

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

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

Если вы посмотрите на подписи метода, требуется CharSequence ..., что означает, что он объединит столько, сколько вы его дадите. – Ljdawson

0

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

Надеется, что это может помочь кому-то.

0

Как отмечает marwinXXII в комментарии, использование TextUtils.concat действительно работает, но может привести к потере стилей в некоторых случаях, когда у вас есть несколько экземпляров одного и того же диапазона в одном CharSequence.

Обходной способ может заключаться в том, чтобы написать CharSequence в Parcel, а затем прочитать его обратно. Пример Котлин кода расширения, чтобы сделать это ниже:

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

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

Смежные вопросы