Qual é o propósito dessas interfaces?
CharSequence
é uma interface Java padrão que representa uma sequência de caracteres. String
é a implementação concreta mais comumente usada de CharSequence
, seguida por StringBuilder
.
Spanned
é um CharSequence
com "spans" indicando a formatação a ser aplicada a partes do texto, onde esses spans não podem ser modificados.
Spannable
é um Spanned
, adicionando a capacidade de modificar as extensões (para adicionar ou remover formatação), mas não para modificar o próprio texto.
SpannedString
é uma implementação concreta da Spanned
interface.
SpannableString
é uma implementação concreta da Spannable
interface.
em quais cenários é mais comum usá-los?
Quando há um método que retorna um (por exemplo, getText()
em um EditText
) ou quando há um método que leva um como parâmetro (por exemplo, setText()
em a TextView
).
Seu citado caso de uso Html.fromHtml()
é talvez o mais comum no desenvolvimento convencional do Android, pois um TextView
com a Spanned
é muito mais leve do que um WebView
. No entanto, existem outros casos de uso, como:
Em que casos é melhor evitar usá-los?
Eles são excepcionalmente terríveis no combate à calvície, remoção de neve, conserto de bombas de calor, fazer um suflê, etc.
:-)
Há algum impacto óbvio no desempenho a ser considerado ao usar qualquer um deles?
As interfaces, por definição, não têm "impactos no desempenho" - são apenas uma descrição de uma API.
Não estou ciente de que SpannableString
é significativamente mais lento do que SpannedString
em qualquer operação específica. No entanto, SpannableStringBuilder
(o que permite manipular o texto além das extensões que formatam esse texto) pode muito bem ser um pouco mais lento do que SpannableString
ou SpannedString
para várias coisas. No entanto, se as diferenças de desempenho são suficientes ou não, dependerá do uso.
spannableString
normal e não normal .. porque estou enfrentando uma grande defasagem comsetText(my_string)
quandomy_string
tem smileys (como o de watsapp) em comparação com a string normal. . (que tem apenas texto simples) por favor, jogue alguma luz ... de alguma forma, eu acreditava que smilleys não são nada além de texto (unicode) apenasImageSpan
que por sua vez exigeSpannableString
.Corda
A
String
é imutável (ou seja, o texto não pode ser alterado). Ele também não tem nenhum período associado a ele. (Spans são intervalos sobre o texto que incluem informações de estilo como cor, realce, itálico, links, etc.) Portanto, você pode usar umString
quando seu texto não precisar ser alterado e não precisar de nenhum estilo.StringBuilder
A
StringBuilder
tem texto mutável, portanto, você pode modificá-lo sem criar um novo objeto. No entanto, ele não possui nenhuma informação de amplitude. É apenas um texto simples. Portanto, use umStringBuilder
quando precisar alterar o texto, mas não se preocupe em estilizá-lo.SpannedString
A
SpannedString
tem texto imutável (como aString
) e informações de amplitude imutáveis. É uma implementação concreta dos requisitos definidos pelaSpanned
interface. Use umSpannedString
quando o seu texto tiver estilo, mas você não precisar alterar o texto ou o estilo após sua criação.Nota: Não existe um
SpannedStringBuilder
porque, se o texto mudasse, as informações de amplitude provavelmente também teriam que mudar.SpannableString
A
SpannableString
possui texto imutável, mas suas informações de amplitude são mutáveis. É uma implementação concreta dos requisitos definidos pelaSpannable
interface. Use umSpannableString
quando seu texto não precisar ser alterado, mas o estilo sim.SpannableStringBuilder
A
SpannableStringBuilder
tem texto mutável e informações de extensão. É uma implementação concreta dos requisitos definidos pelas interfacesSpannable
eEditable
(entre outros). Use umSpannableStringBuilder
quando precisar atualizar o texto e seu estilo.CharSequence
A
CharSequence
é uma interface e não uma classe concreta. Isso significa que apenas define uma lista de regras a seguir para qualquer classe que o implemente. E todas as classes mencionadas acima o implementam. Portanto, você pode usar aCharSequence
quando quiser generalizar o tipo de objeto que possui para obter o máximo de flexibilidade. Você sempre pode fazer o downcast para umString
ouSpannableStringBuilder
ou qualquer outra coisa mais tarde, se necessário.fonte