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.