Usando styles do Android com a Anko

Eu sempre gostei de usar os styles do android para me ajudar a organizar o layout da tela.

Eu criava vários styles onde cada um definia elementos, como um style para o layout principal da janela, outro para os statics, outro para os edits e etc.

Como não tenho nenhuma habilidade de design, criar as telas pensando nestes layouts me ajudava a manter um mínimo de padrão nos meus aplicativos.

Por exemplo, o layout principal da janela é normalmente algo assim:

E a utilização do style:

Recentemente decidi começar a reescrever o meu aplicativo em Kotlin e converter os layouts para usar a biblioteca Anko.

O mesmo layout usando a DSL da Anko:

Eu executei o aplicativo e percebi que o meu style não estava sendo aplicado, mais precisamente o atributo margin.

Recorri ao stack overflow e recebi como resposta que a forma como o Android trata os styles que contém layout_* não me permitiria conseguir o comportamento que eu esperava.

Confesso que não entendi 100% do problema, mas entendi que essa abordagem não funcionaria. Caso queira mais detalhes, segue link da pergunta.

Com isso comecei a procurar por alternativas para conseguir o mesmo comportamento.

Durante minhas buscas, vi que a Anko tem suporte para executar uma função após a geração do layout. Funciona assim: você recebe cada uma das views do seu layout e pode aplicar alguns estilos nela.

Com isso escrevi a seguinte função:

E a chamei na definição do layout:

Assim eu consigo aplicar os styles que eu quero, porém eu os aplicaria para todos os RelativeLayouts da minha tela e não somente para o que eu desejo.

Para contornar este problema, eu decidi criar uma classe que estendesse do RelativeLayout para que eu possa colocar no meu layout e aplicar o style somente para ela:

E para manter compatível com a DSL da Anko, precisei criar uma função que criasse uma view do tipo ViewFrame:

Com isso eu só preciso atualizar a função applyTemplateViewStyles com o novo tipo:

E atualizar o layout com o novo tipo:

Com essa abordagem, eu consegui ter um comportamento bem parecido com o que eu tinha. O único lado negativo é que antes eu poderia redefinir os atributos do layout dentro da tag da view mesmo aplicando o style e agora não é mais possível, visto que os styles são aplicados após a definição da view.

Apesar do lado negativo, eu acredito que a migração para a Anko trás muitos benefícios, a DSL permite definir o layout da tela com muito menos código e você mantém a definição do layout no mesmo arquivo da classe da tela, facilitando a manutenção do código.

Agradecimentos ao Gustavo Freitas, a Thainara Rogério e ao Matheus Gonçalves pela revisão.

Show your support

Clapping shows how much you appreciated Jonathan Rafael Zanella’s story.