Personalizar trechos de um TextView — sim, é possível!
Você com certeza precisará disso um dia.
Algumas vezes nos deparamos com algumas tarefas que parecem ser realmente simples e rápidas de serem resolvidas, porém ao analisar o contexto chegamos àquela pergunta: “bom, achei que teria uma maneira rápida de fazer isso. E agora? Como faço?”. É aí onde entra o Google, é aí onde entra o Stack Overflow, é aí onde entra este artigo.
O que vou explicar aqui é uma maneira simples e rápida de resolver um problema no ambiente Android e que poucas pessoas têm conhecimento. Tenho quase certeza de que você ainda não se perguntou:
Como transformar/personalizar apenas um trecho de uma TextView (com fonte ou cor diferente, por exemplo) e até mesmo fazê-lo clicável?
Em alguns casos é realmente necessário ter um texto com cor diferenciada e um click dentro dele. Como, por exemplo, aqui:
SpannableString, ClickableSpan e ForegroundColorSpan
Com o ClickableSpan, por exemplo, é possível criar uma intent que abre outra atividade e seguir navegando no aplicativo, com o ForegroundColorSpan, é possível determinar a cor para um determinado trecho. Ou seja: recursos realmente bem úteis!
Na API Android existe um objeto chamado SpannableString. E este é a base para que consigamos chegar no resultado esperado.
Ao fim do artigo, vou disponibilizar um código exemplo no Github, para que você possa baixar e tentar por conta própria.
Primeiramente, vamos criar uma string base para realizar nossas alterações:
String initialText = “Tängo Labs is the new thing!”;
Depois, começamos a criação do SpannableString, passando nosso texto no construtor.
SpannableString spannable = new SpannableString(initialText);
ForegroundColorSpan
Em seguida, criamos nosso objeto ForegroundColorSpan com configurações de cor.
ForegroundColorSpan colorSpan = newForegroundColorSpan( Color.BLUE);
E então precisamos achar o range de onde queremos definir a cor. Neste exemplo, vamos definir a cor na palavra “Tängo”. Para tanto, vamos utilizar a função indexOf.
String find = “Tängo”;int rangeStart = initialText.indexOf(find);
int rangeEnd = rangeStart + find.length();
Através do método setSpan, podemos definir várias características à nossa string. É aqui onde vamos adicionar o objeto do tipo ForegroundColorSpan.
spannable.setSpan(colorSpan,rangeStart,rangeEnd,Spannable.SPAN_INCLUSIVE_INCLUSIVE);mCustomTextView.setText( spannable );
Com isso temos uma TextView multicolor. A partir daí, basta explorar os recursos dos objeto.
ClickableSpan
Agora que já adicionamos cor a um pedaço de texto, vamos adicionar um comportamento à este trecho. Com o ClickableSpan é possível definir também, dentro de uma string, um range clicável.
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getApplicationContext(), "Hey you!", Toast.LENGTH_LONG).show();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
};
spannable.setSpan(clickableSpan, rangeStart, rangeEnd, Spannable.SPAN_INCLUSIVE_INCLUSIVE);mCustomTextView.setText(spannable);
mCustomTextView.setMovementMethod(LinkMovementMethod.getInstance());
Aqui eliminamos a necessidade de utilizar um ForegroundColorSpan, já que o objeto ClickableSpan oferece a mesma feature para colorir.
Importante ter em mente sempre que, para definir a cor de um ClickableSpan, deve-se determiná-la no método updateDrawState. É bem simples. E mais: para que o click funcione, é necessário que utilizemos o método setMovementMethod para tornar o ítem clicável. Maiores informações aqui: LinkMovementMethod.
Conclusão
Existem N possibilidades para um TextView – não apenas exibir texto. Estes dois são apenas alguns recursos MUITO úteis e que são usados com freqüência em ambientes ou projetos que o nível dos apps exige um maior cuidado, seja por um time de UX ou até mesmo por uma demanda do cliente. Mas quando isso for necessário, você já saberá como lidar, pois aprendeu aqui, no Tängo Labs. :)
Código de exemplo: https://github.com/dpolcel/ArticleTestSpannableString