73

我把一个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);            

我该怎么做?我还没有找到执行此操作所需的方法或构造函数。

4

5 回答 5

175

你可以使用这个:

TextUtils.concat(span1, span2);

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

于 2011-01-05T15:15:13.080 回答
23

谢谢,它有效。我注意到我甚至可以合并 3 个可跨对象:

(Spanned) TextUtils.concat(foo, bar, baz)
于 2011-01-05T17:49:00.893 回答
7

我知道这是旧的。但是在稍微修改了 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) }
}

希望它可以帮助某人。

于 2017-11-03T13:25:25.323 回答
6

使用SpannableStringBuilder.

甚至更好 - 使 kotlin 运算符重载:

operator fun Spannable.plus(other: Spannable): Spannable{
    return SpannableStringBuilder(this).append(other)
}

只需将其作为顶级函数放入任何 kotlin 文件中即可。

并且您可以使用以下方式连接+

val spanA = ...
val spanB = ...

val concatenatedSpan = spanA + spanB
于 2021-01-10T11:44:51.907 回答
0

正如 marwinXXII 在评论中所说, usingTextUtils.concat确实有效,但在某些情况下,当您在单个CharSequence.

一种解决方法可能是将 a 写入CharSequenceaParcel然后再读回。在下面执行此操作的示例 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不用担心丢失任何样式和格式!

请注意,这适用于大多数样式,它并非一直有效,但应该足以涵盖所有基本样式。

于 2018-03-03T03:05:17.277 回答