2011-01-05 21 views
35

Divido un objeto que se puede dividir en 3 partes, realizo diferentes operaciones y luego necesito unirlas.¿Cómo combinar algunos objetos que se pueden abrir?

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 o constructor requerido para hacerlo.

Respuesta

99
+18

A veces, no muy a menudo, Java hace las cosas fáciles. Me encantan esos momentos. +1 – Madbreaks

+0

@Madbreaks esto no está relacionado con Java, sino con la API de Android. También podría ser más fácil en C++. –

+4

En mi caso, este método tuvo algunos problemas: desapareció el estilo 'TextUtils.concat (span1," "span2);' (es decir, span) para span1, solo queda la representación de cadena. Envolver "" en Spanned no ayudó. – marwinXXII

15

Gracias, funciona. Me he dado cuenta de que puedo fusionar incluso 3 objetos que se pueden abrir:

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

Si miras la firma del método, toma CharSequence ... lo que significa que fusionará todos los que usted le dé. – Ljdawson

0

Sé que es viejo. Sin embargo, 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) } 
} 

esperan que pueda ayudar a alguien.

0

Como dijo marwinXXII en un comentario, usar TextUtils.concat funciona, pero puede causar la pérdida de estilos en algunos casos cuando tiene varias instancias del mismo lapso en un solo CharSequence.

Una solución podría ser escribir el CharSequence en un Parcel y luego volver a leerlo. Ejemplo Kotlin código de extensión de hacerlo a continuación:

uso
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 este código:

TextUtils.concat(*yourListOfText.map { it.cloneWithSpans() }.toTypedArray()) 

Ahora se puede concatenar toneladas de CharSequences sin tener que preocuparse por la pérdida de cualquiera de los estilos y el formato de tener en ellos !

Tenga en cuenta que esto funcionará para más estilos, no funciona todo el tiempo, pero debería ser suficiente para cubrir todos los estilos básicos.

Cuestiones relacionadas