SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
Como Utilizar
Métodos Binding
Adapter no Android
thiengo.com.br
Métodos binding adapter, funcionamento
Primeiro é importante saber que todas as anotações de prefixo @Binding são
anotações "binding adapter" e não somente a anotação @BindingAdapter em
específico.
Há três tipos de funcionamento com métodos binding adapter sendo utilizados, são
eles:
• Busca automática por um método setter, método que aceita como argumento o
o tipo de dado informado no atributo alvo;
• Definição explicita do método que será utilizado - @BindingMethods;
• Definição de lógica sobre qual método será utilizado - @BindingAdapter.
O framework de classes de visualização do Android faz internamente uso de
anotações @Binding, segundo a documentação. Sendo assim o comportamento
padrão é a "busca automática por métodos setters”.
Definições customizadas de métodos binding adapter (o que estudaremos neste
conjunto de slides) sobrescrevem as definições padrões no framework de classes
Android.
Busca automática por um método setter
Na busca automática, caso um atributo, oficial Android ou não, seja utilizado, um
método set com o parâmetro correto é buscado. Exemplo:
• Atributo android:text é utilizado tendo como valor @{ car.model };
• A Data Binding API busca por setText( String ), tendo em mente que a
propriedade model é do tipo String;
• Encontrando o método setText( String ), invoca ele para definir o valor em
android:text.
Os passos anteriores para acionamento do correto método setter são os mesmo
até para atributos não oficiais, como, por exemplo, app:textCar. Neste caso a Data
Binding API buscaria por setTextCar(). Se o argumento informado fosse um do tipo
Int, então a API buscaria por um método setTextCar( Int ).
A API tenta realizar a conversão caso necessário, aplicando um cast. O atributo
android:text (que aciona o método setText()) é o mais simples como exemplo de
conversão, pois o tipo aguardado é um CharSequence, porém frequentemente o
tipo fornecido é uma String.
Acesso a método específico, @BindingMethods
A anotação @BindingMethods nos permite direcionar o método que será invocado de acordo
com a visualização e o atributo sendo utilizados. Veja o código a seguir:
Note que na segunda definição de BindingMethod foi utilizada a superclasse de
TitleTextView, mais precisamente a definição TextView::class. Não há problemas
quanto a isso, pois o que é válido para a superclasse também é válido para as
subclasses.
@BindingMethods aceita quantos BindingMethod forem necessários. Os
argumentos de BindingMethod são, em ordem:
• O tipo da View que terá a alteração do método setter do atributo especificado
- type;
• O atributo que terá um novo método setter vinculado a ele - attribute;
• O rótulo do novo método setter vinculado ao atributo - method.
A documentação oficial informa que a definição de @BindingMethods pode ser
realizada em qualquer classe, incluindo uma classe vazia.
Mas segundo alguns testes realizados a classe tem de ser a classe View que será
utilizada, caso contrário, ao menos para métodos ou atributos novos (não definidos
no framework Android), não haverá vinculo dos métodos binding adapter.
Para melhor entendimento, a definição anterior da classe TitleTextView somente
terá efeito se está classe View for utilizada, como a seguir:
Caso contrário, utilizando diretamente o widget TextView, por exemplo, nem
mesmo o método setPaddingLeft() é invocado. O TextView a seguir não aciona
nenhum dos métodos vinculados anteriormente via @BindingMethods:
Fique ciente que para métodos binding serem invocados, também é preciso o uso
da sintaxe binding, ou seja, o valor do atributo entre @{}.
Um outro ponto importante: na documentação o namespace é informado como
parte irrelevante, mas quando testando temos que a definição attribute = "text"
não aciona o método setTextTitle() como a definição com o namespace attribute =
“android:text".
Ou seja, sim, para qualquer método binding o namespace do atributo é importante.
Thiengo, quantos conflitos com a documentação oficial em relação a prática. É isso
mesmo?
Sim, provavelmente a documentação oficial não está atualizada de acordo com a
evolução da biblioteca Data Binding.
Lógica customizada para acesso a método setter,
@BindingAdapter
Se você estudou o primeiro artigo do Blog sobre Data Binding então já deve conhecer a
anotação @BindingAdapter, que se não utilizada com as devidas precauções pode ser
tão prejudicial quanto os conhecidos "variável global" e "go to".
Diferente de @BindingMethods, métodos @BindingAdapter têm de estar em um
contexto de entidade estática, que no Kotlin é a definição do método dentro de uma
classe object ou companion object e com a anotação @JvmStatic.
O método a seguir é específico para a atualização do padding de topo de uma View
qualquer, e não somente a TitleTextView, que faz uso do atributo android:paddingTop:
O namespace do atributo também é importante aqui. Não há necessidade de ser
um atributo já definido no Android, pode ser um qualquer de sua autoria, incluindo o
namespace.
O método setPaddingTop() anterior seria seguramente acionado pela definição a
seguir:
O primeiro argumento de um método @BindingAdapter é a View alvo, os
argumentos posteriores são os valores dos atributos definidos como argumentos
em @BindingAdapter( ... ).
Agora uma versão @BindingAdapter com mais de um atributo sendo necessário
(ou não) para acionar um método:
Como requireAll foi definido com o valor false, o uso de qualquer um dos
atributos, android:paddingBottom ou android:paddingRight, acionará o método
setPaddingBottomRight().
Como Int é um "tipo primitivo", o 0 será o valor do parâmetro que não tiver um dado
informado em XML.
Em caso de tipo de dado que não é primitivo, coloque a definição de aceitação de
null na declaração do parâmetro (exemplo: Tipo?) quando o requireAll for false,
caso contrário uma exceção poderá ser gerada.
Acessando o antigo e o novo valor em uma mesma definição
de método setter
Caso seja necessário acessar também o valor antigo definido no atributo, a sintaxe
para atendimento a essa necessidade é como a seguir:
O método setMarginLeft() será acionado quando houver, por exemplo, definições
em layout como abaixo:
Caso mais de um atributo seja definido, então os primeiros parâmetros depois do
parâmetro da visualização alvo é que serão os valores antigos, veja o exemplo:
Conversão de valor via @BindingConversion
Em alguns casos a conversão automática da API Data Binding não funciona, isso, pois a
simples sintaxe de cast geraria uma exceção.
Nessas situações nós podemos utilizar a anotação @BindingConversion em um método de
contexto estático, como quando utilizando a anotação @BindingAdapter.
O método conversion definido pode ter qualquer rótulo, mas para ele ser invocado é necessário:
• o tipo de parâmetro correto;
• e também o tipo de retorno correto.
No exemplo a seguir o atributo android:background está recebendo como valor um tipo Int,
pois @color/nome_cor retorna o ID identificador da cor em arquivo XML de cores, porém o tipo
de valor aguardado em android:background é um Drawable:
No código dinâmico podemos ter a seguinte configuração de método de conversão:
Como informado anteriormente, o vinculo entre método setter e atributo ocorre pelo
uso da anotação @BindingConversion em um método de contexto estático e com
os corretos tipos de parâmetro e retorno de função.
Note que de todas as anotações @Binding discutidas neste conjunto de slides,
somente a @BindingConversion trabalha com métodos que têm valor de retorno,
as outras anotações não utilizam valor de retorno.
Pontos negativos
• A uso de anotação para método de conversão, @BindingConversion,
deveria aceitar como argumento o atributo vinculado ao novo método de
conversão, algo similar ao que é necessário quando utilizando
@BindingAdapter. A falta desse vinculo explicito pode confundir alguns
desenvolvedores que estão iniciando na biblioteca Data Binding;
• A teoria na documentação é bem inconsistente quando comparada à prática
da API Data Binding, muitas coisas informadas na documentação divergem
da prática, ou seja, provavelmente a documentação, ao menos para a API
utilizada no contexto Kotlin, está depreciada;
• Todos os métodos binding adapters customizados podem oferecer problemas
de leitura de código, como acontece com o uso de "variáveis globais" e de
sintaxes "go to", caso não muito bem documentados.
Ponto positivo
• Métodos @BindingMethods podem melhorar a arquitetura do projeto, leitura
de código, para novas visualizações que tendem a utilizar os mesmos
atributos de widgets nativos Android, porém com um processamento
diferente, como fizemos com o TitleTextView.
Conclusão
Apesar dos inúmeros problemas entre teoria na documentação e a prática da
parte de métodos binding da API Data Binding, o conhecimento de uso de
@BindingMethods, @BindingAdapter e @BindingConversion pode lhe ajudar
em algumas situações específicas, como foi o caso da visualização personalizada
TitleTextView.
Mas confesso que não vejo o uso dessas anotações sendo algo comum, diferente
do restante dos recursos da biblioteca Data Binding.
De qualquer forma, conhecer por completo a Data Binding API é sim importante,
primeiro porque o mercado de desenvolvedor Android exigi isso, segundo porque
são os problemas específicos de domínio que vão dizer se você está ou não
preparado para utilizar os recursos menos convencionais de qualquer API.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• Como Utilizar Métodos Binding Adapter no Android.
Fontes:
• Binding adapters;
• Data bindings with custom listeners on custom view - Resposta de subhash.
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.
Como Utilizar Métodos Binding
Adapter no Android
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Mais conteúdo relacionado

Mais procurados

Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarVinícius Thiengo
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no AndroidVinícius Thiengo
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIVinícius Thiengo
 
Como Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoComo Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoVinícius Thiengo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidVinícius Thiengo
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidVinícius Thiengo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
Artigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveArtigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveJulian Cesar
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoVinícius Thiengo
 
Introdução ao Github actions - TDC Connections
Introdução ao Github actions - TDC ConnectionsIntrodução ao Github actions - TDC Connections
Introdução ao Github actions - TDC ConnectionsGuillaume Falourd
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Walney Negreiros
 
Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Vanderson Silva
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 

Mais procurados (20)

Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no Android
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Como Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoComo Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento Nativo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
Iniciando com realm
Iniciando com realmIniciando com realm
Iniciando com realm
 
Apostila Android
Apostila AndroidApostila Android
Apostila Android
 
Be React. Do Tests!
Be React. Do Tests!Be React. Do Tests!
Be React. Do Tests!
 
Tdd com Node.js
Tdd com Node.jsTdd com Node.js
Tdd com Node.js
 
Artigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveArtigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle Behave
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
 
Introdução ao Github actions - TDC Connections
Introdução ao Github actions - TDC ConnectionsIntrodução ao Github actions - TDC Connections
Introdução ao Github actions - TDC Connections
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01
 
Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3
 

Semelhante a Como Utilizar Métodos Binding Adapter no Android

Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi SaturninoLevi Saturnino
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojofabioginzel
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
ASP.NET MVC 4 - Parte II - Views
ASP.NET MVC 4 - Parte II - Views ASP.NET MVC 4 - Parte II - Views
ASP.NET MVC 4 - Parte II - Views Carlos Atila Abreu
 
Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6Erisvaldo Junior
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)Alex Camargo
 
ZF Básico - 5. Modelo
ZF Básico - 5. ModeloZF Básico - 5. Modelo
ZF Básico - 5. ModeloMarcos Bezerra
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Erisvaldo Junior
 
Desenvolvimento Delphi
Desenvolvimento DelphiDesenvolvimento Delphi
Desenvolvimento Delphihildebertomelo
 
Robot Framework - principais características
Robot Framework - principais característicasRobot Framework - principais características
Robot Framework - principais característicasalinebiath
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIMario Guedes
 
Atps de banco de dados rel 1 3-4 atualizado formato ok
Atps de banco de dados rel 1 3-4  atualizado formato okAtps de banco de dados rel 1 3-4  atualizado formato ok
Atps de banco de dados rel 1 3-4 atualizado formato okThyvis Kalevi
 
#DeveloperDay - Front-end API html5
#DeveloperDay - Front-end API html5#DeveloperDay - Front-end API html5
#DeveloperDay - Front-end API html5Leandro Santos
 

Semelhante a Como Utilizar Métodos Binding Adapter no Android (20)

Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi Saturnino
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojo
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Acessando banco de dados remoto com android
Acessando banco de dados remoto com android Acessando banco de dados remoto com android
Acessando banco de dados remoto com android
 
ASP.NET MVC 4 - Parte II - Views
ASP.NET MVC 4 - Parte II - Views ASP.NET MVC 4 - Parte II - Views
ASP.NET MVC 4 - Parte II - Views
 
Aula1
Aula1Aula1
Aula1
 
Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)
 
ZF Básico - 5. Modelo
ZF Básico - 5. ModeloZF Básico - 5. Modelo
ZF Básico - 5. Modelo
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
ASP.NET MVC - Model Binding
ASP.NET MVC - Model BindingASP.NET MVC - Model Binding
ASP.NET MVC - Model Binding
 
Desenvolvimento Delphi
Desenvolvimento DelphiDesenvolvimento Delphi
Desenvolvimento Delphi
 
Robot Framework - principais características
Robot Framework - principais característicasRobot Framework - principais características
Robot Framework - principais características
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 
Atps de banco de dados rel 1 3-4 atualizado formato ok
Atps de banco de dados rel 1 3-4  atualizado formato okAtps de banco de dados rel 1 3-4  atualizado formato ok
Atps de banco de dados rel 1 3-4 atualizado formato ok
 
Usando a data grid wpf
Usando a data grid wpfUsando a data grid wpf
Usando a data grid wpf
 
#DeveloperDay - Front-end API html5
#DeveloperDay - Front-end API html5#DeveloperDay - Front-end API html5
#DeveloperDay - Front-end API html5
 
W3 c
W3 cW3 c
W3 c
 

Mais de Vinícius Thiengo

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Vinícius Thiengo
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria LerVinícius Thiengo
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria lerVinícius Thiengo
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomVinícius Thiengo
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidVinícius Thiengo
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidVinícius Thiengo
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarVinícius Thiengo
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalVinícius Thiengo
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidVinícius Thiengo
 

Mais de Vinícius Thiengo (11)

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de Zoom
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
 
Material Design
Material DesignMaterial Design
Material Design
 

Último

Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfFrancisco Márcio Bezerra Oliveira
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfmaurocesarpaesalmeid
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Ilda Bicacro
 
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfPRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfprofesfrancleite
 
AULA DE CARIOLOGIA TSB introdução tudo sobre
AULA DE CARIOLOGIA TSB introdução tudo sobreAULA DE CARIOLOGIA TSB introdução tudo sobre
AULA DE CARIOLOGIA TSB introdução tudo sobremaryalouhannedelimao
 
Araribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medioAraribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medioDomingasMariaRomao
 
A QUATRO MÃOS - MARILDA CASTANHA . pdf
A QUATRO MÃOS  -  MARILDA CASTANHA . pdfA QUATRO MÃOS  -  MARILDA CASTANHA . pdf
A QUATRO MÃOS - MARILDA CASTANHA . pdfAna Lemos
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãIlda Bicacro
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números Mary Alvarenga
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médiorosenilrucks
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfEmanuel Pio
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESEduardaReis50
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfLeloIurk1
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfHELENO FAVACHO
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxLuizHenriquedeAlmeid6
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesFabianeMartins35
 
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanhola
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanholaSLIDE DE Revolução Mexicana 1910 da disciplina cultura espanhola
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanholacleanelima11
 
BNCC Geografia.docx objeto de conhecimento
BNCC Geografia.docx objeto de conhecimentoBNCC Geografia.docx objeto de conhecimento
BNCC Geografia.docx objeto de conhecimentoGentil Eronides
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxferreirapriscilla84
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 

Último (20)

Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfPRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
 
AULA DE CARIOLOGIA TSB introdução tudo sobre
AULA DE CARIOLOGIA TSB introdução tudo sobreAULA DE CARIOLOGIA TSB introdução tudo sobre
AULA DE CARIOLOGIA TSB introdução tudo sobre
 
Araribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medioAraribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medio
 
A QUATRO MÃOS - MARILDA CASTANHA . pdf
A QUATRO MÃOS  -  MARILDA CASTANHA . pdfA QUATRO MÃOS  -  MARILDA CASTANHA . pdf
A QUATRO MÃOS - MARILDA CASTANHA . pdf
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! Sertã
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanhola
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanholaSLIDE DE Revolução Mexicana 1910 da disciplina cultura espanhola
SLIDE DE Revolução Mexicana 1910 da disciplina cultura espanhola
 
BNCC Geografia.docx objeto de conhecimento
BNCC Geografia.docx objeto de conhecimentoBNCC Geografia.docx objeto de conhecimento
BNCC Geografia.docx objeto de conhecimento
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptx
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 

Como Utilizar Métodos Binding Adapter no Android

  • 1. Como Utilizar Métodos Binding Adapter no Android thiengo.com.br
  • 2. Métodos binding adapter, funcionamento Primeiro é importante saber que todas as anotações de prefixo @Binding são anotações "binding adapter" e não somente a anotação @BindingAdapter em específico. Há três tipos de funcionamento com métodos binding adapter sendo utilizados, são eles: • Busca automática por um método setter, método que aceita como argumento o o tipo de dado informado no atributo alvo; • Definição explicita do método que será utilizado - @BindingMethods; • Definição de lógica sobre qual método será utilizado - @BindingAdapter. O framework de classes de visualização do Android faz internamente uso de anotações @Binding, segundo a documentação. Sendo assim o comportamento padrão é a "busca automática por métodos setters”. Definições customizadas de métodos binding adapter (o que estudaremos neste conjunto de slides) sobrescrevem as definições padrões no framework de classes Android.
  • 3. Busca automática por um método setter Na busca automática, caso um atributo, oficial Android ou não, seja utilizado, um método set com o parâmetro correto é buscado. Exemplo: • Atributo android:text é utilizado tendo como valor @{ car.model }; • A Data Binding API busca por setText( String ), tendo em mente que a propriedade model é do tipo String; • Encontrando o método setText( String ), invoca ele para definir o valor em android:text. Os passos anteriores para acionamento do correto método setter são os mesmo até para atributos não oficiais, como, por exemplo, app:textCar. Neste caso a Data Binding API buscaria por setTextCar(). Se o argumento informado fosse um do tipo Int, então a API buscaria por um método setTextCar( Int ). A API tenta realizar a conversão caso necessário, aplicando um cast. O atributo android:text (que aciona o método setText()) é o mais simples como exemplo de conversão, pois o tipo aguardado é um CharSequence, porém frequentemente o tipo fornecido é uma String.
  • 4. Acesso a método específico, @BindingMethods A anotação @BindingMethods nos permite direcionar o método que será invocado de acordo com a visualização e o atributo sendo utilizados. Veja o código a seguir:
  • 5. Note que na segunda definição de BindingMethod foi utilizada a superclasse de TitleTextView, mais precisamente a definição TextView::class. Não há problemas quanto a isso, pois o que é válido para a superclasse também é válido para as subclasses. @BindingMethods aceita quantos BindingMethod forem necessários. Os argumentos de BindingMethod são, em ordem: • O tipo da View que terá a alteração do método setter do atributo especificado - type; • O atributo que terá um novo método setter vinculado a ele - attribute; • O rótulo do novo método setter vinculado ao atributo - method. A documentação oficial informa que a definição de @BindingMethods pode ser realizada em qualquer classe, incluindo uma classe vazia. Mas segundo alguns testes realizados a classe tem de ser a classe View que será utilizada, caso contrário, ao menos para métodos ou atributos novos (não definidos no framework Android), não haverá vinculo dos métodos binding adapter.
  • 6. Para melhor entendimento, a definição anterior da classe TitleTextView somente terá efeito se está classe View for utilizada, como a seguir: Caso contrário, utilizando diretamente o widget TextView, por exemplo, nem mesmo o método setPaddingLeft() é invocado. O TextView a seguir não aciona nenhum dos métodos vinculados anteriormente via @BindingMethods:
  • 7. Fique ciente que para métodos binding serem invocados, também é preciso o uso da sintaxe binding, ou seja, o valor do atributo entre @{}. Um outro ponto importante: na documentação o namespace é informado como parte irrelevante, mas quando testando temos que a definição attribute = "text" não aciona o método setTextTitle() como a definição com o namespace attribute = “android:text". Ou seja, sim, para qualquer método binding o namespace do atributo é importante. Thiengo, quantos conflitos com a documentação oficial em relação a prática. É isso mesmo? Sim, provavelmente a documentação oficial não está atualizada de acordo com a evolução da biblioteca Data Binding.
  • 8. Lógica customizada para acesso a método setter, @BindingAdapter Se você estudou o primeiro artigo do Blog sobre Data Binding então já deve conhecer a anotação @BindingAdapter, que se não utilizada com as devidas precauções pode ser tão prejudicial quanto os conhecidos "variável global" e "go to". Diferente de @BindingMethods, métodos @BindingAdapter têm de estar em um contexto de entidade estática, que no Kotlin é a definição do método dentro de uma classe object ou companion object e com a anotação @JvmStatic. O método a seguir é específico para a atualização do padding de topo de uma View qualquer, e não somente a TitleTextView, que faz uso do atributo android:paddingTop:
  • 9. O namespace do atributo também é importante aqui. Não há necessidade de ser um atributo já definido no Android, pode ser um qualquer de sua autoria, incluindo o namespace. O método setPaddingTop() anterior seria seguramente acionado pela definição a seguir: O primeiro argumento de um método @BindingAdapter é a View alvo, os argumentos posteriores são os valores dos atributos definidos como argumentos em @BindingAdapter( ... ).
  • 10. Agora uma versão @BindingAdapter com mais de um atributo sendo necessário (ou não) para acionar um método: Como requireAll foi definido com o valor false, o uso de qualquer um dos atributos, android:paddingBottom ou android:paddingRight, acionará o método setPaddingBottomRight(). Como Int é um "tipo primitivo", o 0 será o valor do parâmetro que não tiver um dado informado em XML. Em caso de tipo de dado que não é primitivo, coloque a definição de aceitação de null na declaração do parâmetro (exemplo: Tipo?) quando o requireAll for false, caso contrário uma exceção poderá ser gerada.
  • 11. Acessando o antigo e o novo valor em uma mesma definição de método setter Caso seja necessário acessar também o valor antigo definido no atributo, a sintaxe para atendimento a essa necessidade é como a seguir:
  • 12. O método setMarginLeft() será acionado quando houver, por exemplo, definições em layout como abaixo: Caso mais de um atributo seja definido, então os primeiros parâmetros depois do parâmetro da visualização alvo é que serão os valores antigos, veja o exemplo:
  • 13. Conversão de valor via @BindingConversion Em alguns casos a conversão automática da API Data Binding não funciona, isso, pois a simples sintaxe de cast geraria uma exceção. Nessas situações nós podemos utilizar a anotação @BindingConversion em um método de contexto estático, como quando utilizando a anotação @BindingAdapter. O método conversion definido pode ter qualquer rótulo, mas para ele ser invocado é necessário: • o tipo de parâmetro correto; • e também o tipo de retorno correto. No exemplo a seguir o atributo android:background está recebendo como valor um tipo Int, pois @color/nome_cor retorna o ID identificador da cor em arquivo XML de cores, porém o tipo de valor aguardado em android:background é um Drawable:
  • 14. No código dinâmico podemos ter a seguinte configuração de método de conversão: Como informado anteriormente, o vinculo entre método setter e atributo ocorre pelo uso da anotação @BindingConversion em um método de contexto estático e com os corretos tipos de parâmetro e retorno de função. Note que de todas as anotações @Binding discutidas neste conjunto de slides, somente a @BindingConversion trabalha com métodos que têm valor de retorno, as outras anotações não utilizam valor de retorno.
  • 15. Pontos negativos • A uso de anotação para método de conversão, @BindingConversion, deveria aceitar como argumento o atributo vinculado ao novo método de conversão, algo similar ao que é necessário quando utilizando @BindingAdapter. A falta desse vinculo explicito pode confundir alguns desenvolvedores que estão iniciando na biblioteca Data Binding; • A teoria na documentação é bem inconsistente quando comparada à prática da API Data Binding, muitas coisas informadas na documentação divergem da prática, ou seja, provavelmente a documentação, ao menos para a API utilizada no contexto Kotlin, está depreciada; • Todos os métodos binding adapters customizados podem oferecer problemas de leitura de código, como acontece com o uso de "variáveis globais" e de sintaxes "go to", caso não muito bem documentados.
  • 16. Ponto positivo • Métodos @BindingMethods podem melhorar a arquitetura do projeto, leitura de código, para novas visualizações que tendem a utilizar os mesmos atributos de widgets nativos Android, porém com um processamento diferente, como fizemos com o TitleTextView.
  • 17. Conclusão Apesar dos inúmeros problemas entre teoria na documentação e a prática da parte de métodos binding da API Data Binding, o conhecimento de uso de @BindingMethods, @BindingAdapter e @BindingConversion pode lhe ajudar em algumas situações específicas, como foi o caso da visualização personalizada TitleTextView. Mas confesso que não vejo o uso dessas anotações sendo algo comum, diferente do restante dos recursos da biblioteca Data Binding. De qualquer forma, conhecer por completo a Data Binding API é sim importante, primeiro porque o mercado de desenvolvedor Android exigi isso, segundo porque são os problemas específicos de domínio que vão dizer se você está ou não preparado para utilizar os recursos menos convencionais de qualquer API.
  • 18. Fontes Conteúdo completo, em texto e em vídeo, no link a seguir: • Como Utilizar Métodos Binding Adapter no Android. Fontes: • Binding adapters; • Data bindings with custom listeners on custom view - Resposta de subhash.
  • 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. Como Utilizar Métodos Binding Adapter no Android thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com