我将一个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);
我该怎么办?我没有找到所需的方法或构造函数。
答案 0 :(得分:137)
你可以用这个:
TextUtils.concat(span1, span2);
http://developer.android.com/reference/android/text/TextUtils.html#concat(java.lang.CharSequence...)
答案 1 :(得分:19)
谢谢,它有效。我注意到我甚至可以合并3个spannable对象:
(Spanned) TextUtils.concat(foo, bar, baz)
答案 2 :(得分:4)
使用SpannableStringBuilder
。
甚至更好 - 使 kotlin 运算符重载:
operator fun Spannable.plus(other: Spannable): Spannable{
return SpannableStringBuilder(this).append(other)
}
只需将其作为顶级函数扔到任何 kotlin 文件中即可。
并且您可以使用 +
进行连接:
val spanA = ...
val spanB = ...
val concatenatedSpan = spanA + spanB
答案 3 :(得分:1)
我知道这是旧的。但是在修改了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 :(得分:0)
正如marwinXXII在评论中所说,使用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
,而不必担心丢失任何样式和格式!
请注意,这适用于大多数样式,它不会一直有效,但应足以涵盖所有基本样式。