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.