Customizar partes do texto no TextView nas aplicações Android

Muitas vezes precisamos de customizar partes do texto, para dar um destaque, seja um trecho em negrito, itálico, colorido ou mesmo um link.

No Android, conseguimos customizar partes do texto criando uma SpannableString e atribuindo diversos tipos de “span” à ela.

Para exemplificar vamos utilizar o texto:

A raposa marrom ataca o cão preguiçoso.

Precisamos criar um objeto SpannableString com o texto desejado.

String textoCompleto = "A raposa marrom ataca o cão preguiçoso.";
Spannable spannableText = new SpannableString(textoCompleto);

Com a variável spannableText vamos atribuir span (marcação) conforme precisamos, informando onde a marcação irá começar e terminar no texto. E depois configurar o texto da TextView com esse novo objeto.

Atribuir marcação de negrito (itálico) :

int start = 24;
int end = 27;
spannableText.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);
myTextView.setText(spannableText);
A raposa marrom ataca o cão preguiçoso.

Outros tipos para serem usados: Typeface.ITALIC, Typeface.BOLD_ITALIC.

Também é possível atribuir uma cor:

String textoCompleto = "A raposa marrom ataca o cão preguiçoso.";
Spannable spannableText = new SpannableString(textoCompleto);
int start = 24;
int end = 27;
spannableText.setSpan(new ForegroundColorSpan(
ContextCompat.getColor (context, R.color.vermelho)),start, end, 0);

myTextView.setText(spannableText);

Criar um Link no meio do texto:

String textoCompleto = "A raposa marrom ataca o cão preguiçoso.";
Spannable spannableText = new SpannableString(textoCompleto);
int start = 24;
int end = 27;
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Clicou", Toast.LENGTH_LONG).show();
}
};
spannableText.setSpan(clickableSpan, start, end, 0);

myTextView.setText(spannableText);
myTextView.setMovementMethod(LinkMovementMethod.getInstance());

Spannable Utils

Criei uma classe simples com esses métodos para facilitar a utilização do Spannable. Basta copiar essa classe para seu projeto, entende-la e usar:

SpannableUtils.destacarTextoComNegrito("A raposa marrom ataca o cão preguiçoso.", "cão", textView);

Conteúdo extra

Só para lembrar que eu já publiquei sobre como criar views customizadas para Android. Assim, se necessário, podemos criar um novo componente (widget) chamadoSpannableTextView, que seria um TexView já com as implementações do SpannableUtil para auxiliar na customização do texto.