android - merger - manifest "tools:replace"
¿Cómo fusionar algunos objetos distribuibles? (4)
Divido un objeto distribuible en 3 partes, hago diferentes operaciones y luego necesito fusionarlas.
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);
¿Cómo puedo hacerlo? No he encontrado el método requerido o el constructor para hacerlo.
Como dijo marwinXXII en un comentario, el uso de TextUtils.concat
funciona pero puede causar la pérdida de estilos en algunos casos cuando tiene varias instancias de la misma extensión en una sola CharSequence
.
Una solución alternativa podría ser escribir la CharSequence
en una Parcel
y luego leerla nuevamente. Ejemplo de código de extensión de Kotlin para hacer esto a continuación:
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
}
Ejemplo de uso de este código:
TextUtils.concat(*yourListOfText.map { it.cloneWithSpans() }.toTypedArray())
¡Ahora puede concatenar toneladas de CharSequences
sin preocuparse por perder ninguno de los estilos y el formato que tiene en ellas!
Tenga en cuenta que esto funcionará para la mayoría de los estilos, no funciona todo el tiempo pero debería ser suficiente para cubrir todos los estilos básicos.
Gracias, funciona. Me he dado cuenta de que puedo fusionar incluso 3 objetos distribuibles:
(Spanned) TextUtils.concat(foo, bar, baz)
Podrías usar esto:
TextUtils.concat(span1, span2);
http://developer.android.com/reference/android/text/TextUtils.html#concat(java.lang.CharSequence...)
Sé que es viejo. Pero después de modificar kotlin stdlib un poco tengo este código:
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) }
}
Espero que pueda ayudar a alguien.