➙ Conteúdo completo, texto e vídeo, em: https://www.thiengo.com.br/annotation-span-para-estilizacao-de-texto-no-android
Neste conjunto de slides nós vamos, passo a passo, estudar a Annotation Span, API utilizada principalmente em aplicativos que atendem a mais de um idioma e têm estilos complexos em Strings estáticas.
➙ Para receber o conteúdo do blog em primeira mão, assine a lista de emails em: http://www.thiengo.com.br
Abraço.
▶ Treinamento oficial:
➙ Prototipagem Profissional de Aplicativos Android:
↳ https://www.udemy.com/android-prototipagem-profissional-de-aplicativos/persist_locale&locale=pt_BR
▶ Livros oficiais:
➙ Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia:
↳ https://www.thiengo.com.br/livro-desenvolvedor-kotlin-android
➙ Receitas Para Desenvolvedores Android:
↳ https://www.thiengo.com.br/livro-receitas-para-desenvolvedores-android
➙ Refatorando Para Programas Limpos:
↳ https://www.thiengo.com.br/livro-refatorando-para-programas-limpos
▶ Redes:
➙ Udemy: https://www.udemy.com/user/vinicius-thiengo/?persist_locale&locale=pt_BR
➙ YouTube: https://www.youtube.com/user/thiengoCalopsita
➙ Facebook: https://www.facebook.com/thiengoCalopsita
➙ LinkedIn: https://www.linkedin.com/in/vin%C3%ADcius-thiengo-5179b180/
➙ GitHub: https://github.com/viniciusthiengo
➙ Twitter: https://twitter.com/thiengoCalops
➙ Google Plus: https://plus.google.com/+ThiengoCalopsita
▶ Blog App:
➙ https://play.google.com/store/apps/details?id=br.thiengocalopsita&hl=pt_BR
2. Por que utilizar Annotation se podemos utilizar tags HTML?
Excelente pergunta. Realmente podemos utilizar HTML, mas há limitações, pois não
são todas as tags HTML que são interpretadas quando as utilizando em arquivos de
String, arquivos XML que serão necessários principalmente na internacionalização do
aplicativo Android.
As Annotation Span entram em cena quando uma estilização em texto estático é
necessária e as tags HTML suportadas não dão conta de fornecer o estilo apropriado.
Mas eu poderia trabalhar diretamente com SpannableString, certo?
Sim, você poderia. O problema, mesmo quando não há necessidade de mais de um
arquivo de Strings, é que será necessário o conhecimento dos posicionamentos dos
trechos de textos que precisam ser estilizados, algo dispensável quando utilizando
Annotation Span, pois os posicionamentos são obtidos em tempo de execução por
métodos fornecidos pela API.
Essa necessidade de conhecimento dos posicionamentos se torna algo crítico quando
mais de um arquivo de Strings passa a ser necessário ou quando o único arquivo de
Strings precisa passar por atualização de texto, as posições utilizadas em código
como "hard-coded" deverão ser atualizadas, algo que atrapalha a evolução de
qualquer projeto de software.
3. Tags HTML suportadas em código estático
Para que você não queira sempre utilizar a Annotation Span, até porque o código dela e menos simples do que
quando utilizando tags HTML, a seguir deixo todas as tags HTML de estilo suportadas em arquivos Android de
Strings:
• <b> para negrito;
• <i> para itálico;
• <big> para um texto 25% maior do que o tamanho aplicado ao conjunto;
• <small> para um texto 20% menor do que o tamanho aplicado ao conjunto;
• <font> para um texto com cor distinta (em hexadecimal e utilizando o atributo color) ou com uma família
de fontes distinta (utilizando o atributo face com algum dos possíveis valores: serif, sans_serif e
monospace);
• <tt> para um texto em monospace;
• <strike> para um texto com uma linha no meio;
• <u> para um texto sublinhado;
• <sup> para um texto em linha superior;
• <sub> para um texto em linha inferior.
Se você for estudar também os links de fontes que coloquei neste conjunto de slides (e no artigo destes slides),
notará que em um deles, mais precisamente o artigo da Florina Muntenescu, do Google Android Developers, há
ainda mais tags HTML de estilo que são suportadas, digo, que é informado que são suportadas.
Mas quando testando em código, para tags de estilo, somente as que citei anteriormente é que funcionam.
4. Tags HTML de estilo em execução
A seguir um código XML, strings.xml, com algumas configurações de tag HTML de estilo
em uso:
5. Note que <![CDATA[...]]> é utilizado para escapar os símbolos de tag <>.
Executando o aplicativo Android com o código anterior, aplicando cada String a um
TextView, temos:
6. Annotation Span
Uma tag Annotation é formada por: <annotation key="value">. É isso mesmo, o
conhecido key="value".
Você pode utilizar o rótulo que quiser para a key (chave), mas seguindo as
restrições de nome que temos para variáveis em código dinâmico: nada de
espaços em branco ou acentuação.
Para value (valor), qualquer valor pode ser utilizado, mas esse sempre será tratado
em código como String.
7. Arquivos com annotation
A seguir temos um arquivo de Strings, /res/values/strings.xml, que representa o
idioma padrão do aparelho de testes, aqui um device em português do Brasil:
8. Então o arquivo de Strings, /res/values-en/strings.xml, que representa o idioma inglês
para aparelhos tendo está língua como padrão:
Note que não há problemas em utilizar ao mesmo tempo tags HTML de estilo e tags
<annotation>.
A definição key="value" para o exemplo é: fontFamily="nome da família de fonte".
Como estaremos utilizando uma família de fonte não padrão, a melhor escolha foi o
uso de Annotation Span (a tag <annotation> é uma Span - abreviação de Spanned).
Em resumo: uma Span permite a aplicação de estilos em String.
9. Aplicando estilos de acordo com as annotation tags
Agora é preciso, em código dinâmico, identificar as annotations e então aplicar os
estilos corretos.
É importante assumir que temos duas fontes extras em /res/font. São elas:
• cinzel.ttf;
• e fredoka_one.ttf.
Para saber mais sobre fonts in XML no Android, acesse Fontes em XML, Android
O. Configuração e Uso.
Assim o código que aplica os estilos, famílias de fontes (leia todos os comentários):
10.
11. Note como os text.getSpanStart( annotation ) e text.getSpanEnd( annotation )
permitem que nós desenvolvedores não tenhamos de gravar em código os
posicionamentos dos textos que terão de ser estilizados. Este é um grande ganho
em relação a utilizar diretamente, e somente, objetos Spanned em código
dinâmico.
Você deve estar se perguntando sobre a classe CustomTypefaceSpan, certo?
Essa é uma classe hackcode criada para ser possível a definição de família de
fonte em uma String Spanned, segue o boilerplate code dela:
12.
13. Está classe também esta presente no artigo de fonts in XML indicado anteriormente.
Executando o projeto, primeiro com o aparelho no idioma configurado em português
e depois modificando o idioma para inglês, temos:
14. Conteúdos importantes
Para tirar o máximo do conteúdo sobre Annotation Span, fortemente recomendo
que ao final do estudo deste conjunto de slides você estude também os artigos dos
links a seguir, todos sobre famílias de fontes e estilização de Strings no Android:
• Como Utilizar Spannable no Android Para Customizar Strings;
• Fontes em XML, Android O. Configuração e Uso;
• Definindo Fontes em Trechos Não Triviais do Android.
15. Ponto negativo
• Tags <annotation> têm a limitação de aceitarem somente um par
key="value". Poderia aceitar mais, evitando o uso de mais de uma
<annotation> para um mesmo trecho de texto estático, por exemplo.
16. Ponto positivo
• Ganho considerável, em código dinâmico, pela não necessidade de
conhecimento prévio das posições dos trechos de textos que devem ser
estilizados.
17. Considerações finais
Quando há a necessidade de trabalho com Spanned String em texto estático,
mesmo que ainda não havendo necessidade de mais de um idioma em projeto
Android, o uso de tags <annotation> trará maior eficiência principalmente na
atualização de código, de textos em strings.xml.
Isso, pois o conhecimento prévio do posicionamento dos textos que têm de receber
estilos complexos não será necessário, as APIs de Annotation permitem o fácil
acesso às posições.
18. Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• Annotation Span para Estilização de Texto no Android.
Fontes:
• Styling internationalized text in Android;
• AnnotationSpans – Part 1;
• Language and locale resolution overview;
• Get font resource from TypedArray before API 26 - Resposta de Tom;
• Display Back Arrow on Toolbar - Resposta de MrEngineer13 e de Brais
Gabin;
• Set drawable for DividerItemDecoration;
• Reference one string from another string in strings.xml? - Resposta de
Beeing Jk e de Joseph Garrone.
19. Para estudo
• Treinamento oficial:
• Prototipagem Profissional de Aplicativos Android.
• Meus livros:
• Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia;
• Receitas Para Desenvolvedores Android;
• Refatorando Para Programas Limpos.
• Redes:
• Udemy;
• YouTube;
• Facebook;
• LinkedIn;
• GitHub;
• Twitter;
• Google Plus.
• Blog App.
20. Annotation Span Para Estilização de
Texto no Android
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com