如何合并一些spannable对象?

Eug*_*ene 57 android charsequence 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);            
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我还没有找到所需的方法或构造函数.

xil*_*il3 140

你可以用这个:

TextUtils.concat(span1, span2);
Run Code Online (Sandbox Code Playgroud)

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

  • 有时候,Java并不经常让事情变得简单.我喜欢那些时代.+1 (23认同)
  • 在我的例子中,这个方法有一些问题:`TextUtils.concat(span1,"",span2);`span1的样式(即span)消失了,只剩下它的字符串表示.将""包装成跨越并没有帮助. (7认同)
  • 同样的事情,这里第一个spannable失去造型只有第二个保持其风格! (4认同)
  • 如果你的第一个跨度样式消失了,可能是因为你在两个跨度上都使用了相同的`StyleSpan`.您需要为每个跨度创建一个新的"StyleSpan".(见[这个答案](http://stackoverflow.com/a/5999171/1440076)) (3认同)

Eug*_*ene 20

谢谢,它的工作原理.我注意到我甚至可以合并3个spannable对象:

(Spanned) TextUtils.concat(foo, bar, baz)
Run Code Online (Sandbox Code Playgroud)

  • 如果你看方法签名,它需要CharSequence ...这意味着它将合并你给它的数量. (8认同)

Ale*_*ost 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) }
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人。


Mar*_*ann 5

使用SpannableStringBuilder.

更好的是 - 使 kotlin 运算符重载:

operator fun Spannable.plus(other: Spannable): Spannable{
    return SpannableStringBuilder(this).append(other)
}
Run Code Online (Sandbox Code Playgroud)

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

并且您可以使用+以下方法进行连接:

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

val concatenatedSpan = spanA + spanB
Run Code Online (Sandbox Code Playgroud)