Personalizar trechos de um TextView — sim, é possível!

Você com certeza precisará disso um dia.

Diego Polcel
Tängo Labs BR
3 min readOct 16, 2017

--

Imagem aleatória porque não tenho outra pra colocar, mas que tem relação com o conteúdo.

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:

Highlight é importante, bem como click. Ajuda muito!

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:

Depois, começamos a criação do SpannableString, passando nosso texto no construtor.

ForegroundColorSpan

Em seguida, criamos nosso objeto ForegroundColorSpan com configurações de cor.

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.

Através do método setSpan, podemos definir várias características à nossa string. É aqui onde vamos adicionar o objeto do tipo ForegroundColorSpan.

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.

Aqui eliminamos a necessidade de utilizar um ForegroundColorSpan, já que o objeto ClickableSpan oferece a mesma feature para colorir.

O resultado no final é este. Clicando no ClickableSpan definido anteriormente, um Toast aparece com o texto “Hey you!”.

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. :)

--

--

Diego Polcel
Tängo Labs BR

Ribeirãopirense since 90’s, bicicleteiro, mobile & web developer. Um pouco especialista em produto. Software Engineering Manager no @iFood.