¿Cuál es el propósito de estas interfaces?
CharSequence
es una interfaz estándar de Java que representa una secuencia de caracteres. String
es la implementación concreta más utilizada de CharSequence
, seguida de StringBuilder
.
Spanned
es un CharSequence
con "intervalos" que indica el formato que se aplicará a partes del texto, donde esos intervalos no se pueden modificar.
Spannable
es a Spanned
, agregando la capacidad de modificar los intervalos (para agregar o quitar formato), pero no para modificar el texto en sí.
SpannedString
es una implementación concreta de la Spanned
interfaz.
SpannableString
es una implementación concreta de la Spannable
interfaz.
¿En qué escenarios es más común usarlos?
Cuando hay un método que devuelve uno (por ejemplo, getText()
en un EditText
) o cuando hay un método que toma uno como parámetro (por ejemplo, setText()
en a TextView
).
Su caso de uso citado Html.fromHtml()
es quizás el más común en el desarrollo convencional de Android, ya que un TextView
con a Spanned
es mucho más liviano que un WebView
. Sin embargo, existen otros casos de uso, como:
¿En qué casos es mejor evitar su uso?
Son particularmente horribles para combatir la calvicie, quitar la nieve, reparar la bomba de calor, hacer un soufflé, etc.
:-)
¿Hay algún impacto obvio en el rendimiento que deba tenerse en cuenta al utilizar alguno de ellos?
Las interfaces, por definición, no tienen "impactos en el rendimiento", son simplemente una descripción de una API.
No sé que SpannableString
sea significativamente más lento que SpannedString
en cualquier operación en particular. Sin embargo, SpannableStringBuilder
(lo que permite manipular el texto además de los intervalos que formatean ese texto) bien puede ser un poco más lento que SpannableString
o SpannedString
para varias cosas. Sin embargo, si las diferencias de rendimiento son suficientes o no, dependerá del uso.
spannableString
y no una normal ... porque me enfrento a un gran retrasosetText(my_string)
cuandomy_string
tiene emoticones (como la de watsapp) en comparación con una cadena normal. . (que solo tiene texto sin formato) amablemente arroje algo de luz ... de alguna manera creí que los smilleys no son más que texto (unicode) soloImageSpan
que a su vez requiereSpannableString
.Cuerda
A
String
es inmutable (es decir, el texto no puede cambiar). Tampoco tiene ningún intervalo asociado. (Los intervalos son rangos sobre el texto que incluyen información de estilo como color, resaltado, cursiva, enlaces, etc.) Por lo tanto, puede usar unString
cuando su texto no necesita ser cambiado y no necesita ningún estilo.StringBuilder
A
StringBuilder
tiene texto mutable, por lo que puede modificarlo sin crear un nuevo objeto. Sin embargo, no tiene información sobre el intervalo. Es solo texto sin formato. Por lo tanto, use aStringBuilder
cuando necesite cambiar el texto, pero no le importa darle estilo.SpannedString
A
SpannedString
tiene texto inmutable (como aString
) e información de intervalo inmutable. Es una implementación concreta de los requisitos definidos por laSpanned
interfaz. Use aSpannedString
cuando su texto tenga estilo, pero no necesite cambiar el texto ni el estilo después de su creación.Nota: No existe tal cosa como un
SpannedStringBuilder
porque si el texto cambia, es muy probable que la información del intervalo también tenga que cambiar.SpannableString
A
SpannableString
tiene texto inmutable, pero su información de intervalo es mutable. Es una implementación concreta de los requisitos definidos por laSpannable
interfaz. Use aSpannableString
cuando su texto no necesite ser cambiado pero el estilo sí.SpannableStringBuilder
A
SpannableStringBuilder
tiene tanto texto mutable como información de extensión. Es una implementación concreta de los requisitos definidos por las interfacesSpannable
yEditable
(entre otros). Utilice aSpannableStringBuilder
cuando necesite actualizar el texto y su estilo.CharSequence
A
CharSequence
es una interfaz y no una clase concreta. Eso significa que solo define una lista de reglas a seguir para cualquier clase que lo implemente. Y todas las clases mencionadas anteriormente lo implementan. Por lo tanto, puede usar unCharSequence
cuando desee generalizar el tipo de objeto que tiene para una máxima flexibilidad. Siempre se puede abatido a unaString
oSpannableStringBuilder
o lo que sea más tarde si es necesario.fuente