SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Data Binding
Francisco Cavedon
Coordenador Técnico @ B2W Digital
francisco.cavedon@b2wdigital.com
B2W Digital
Informação Institucional Pendente de Aprovação
Agenda
1. Sobre Data Binding
2. Configuração
3. Data Binding na Prática
4. Expression Language
5. Two-Way Binding
6. Binding Adapter
7. Exemplo de Arquitetura
8. Dúvidas?
O que é Data Binding?
1. Lançado no I/O 2015
2. “Angular para Android”
3. Layouts declarativos
4. Minimiza a necessidade de “cola” entre layout e lógica
Porque usar?
1. Separação de responsabilidades
1. Lógica de visualização fica no layout
2. Testabilidade
3. Simplificar a relação layout-código
1. Chega de findViewById!
2. Expression Language
Configuração
android {

…

dataBinding {

enabled = true

}

}
Data Binding na Prática
<layout>

<android.support.design.widget.CoordinatorLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

tools:context=".activity.MainActivity">



<include

android:id="@+id/include_search_appbar"

layout="@layout/include_search_appbar"/>



<fragment

android:id="@+id/home_container"

android:name=".fragment.HomeFragment"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:layout="@layout/fragment_home" />



</android.support.design.widget.CoordinatorLayout>

</layout>
Data Binding na Prática
<layout>

<android.support.design.widget.AppBarLayout

android:layout_width="match_parent"

android:layout_height="wrap_content">



<android.support.v7.widget.Toolbar

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:background="?attr/colorPrimary"

app:contentInsetEnd="8dp"

app:contentInsetStart="8dp"

app:popupTheme="@style/AppTheme.PopupOverlay">

…


</android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

</layout>
Data Binding na Prática
ActivityMainBinding activityMainBinding;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);



activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);



Toolbar toolbar = activityMainBinding.includeSearchAppbar.toolbar;

setSupportActionBar(toolbar);

}
Data Binding na Prática
<layout>

<data>

<variable name=“filterItem” type="model.item.filter.FilterItemViewModel"/>

</data>



<RelativeLayout

android:layout_width="match_parent"

android:layout_height="wrap_content">



<TextView android:id="@+id/filter_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{filterItem.name}"/>



<TextView android:id="@+id/filter_item_quantity"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{filterItem.itemQuantity}"/>



</RelativeLayout>

</layout>
Data Binding na Prática
public class SampleFilter extends RelativeLayout {



ViewFilterItemBinding filterItemBinding;



public SampleFilter(Context context) {

super(context);



filterItemBinding = DataBindingUtil.inflate(LayoutInflater.from(context),
R.layout.view_filter_item, null, true);

}



public void setFilter(FilterItemViewModel viewModel) {

filterItemBinding.setFilterItem(viewModel);

}

}
…
SampleFilter sampleFilter = new SampleFilter(context);

sampleFilter.setFilter(viewModel);
Expression Language
<TextView

android:id="@+id/review_result_positive_feedback"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=“@{@plurals/feedback_count(viewModel.positiveFeedback)}”

tools:text="10 pessoas curtiram isso" />
<TextView

android:id="@+id/rating_total_count"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{@string/rating_total_count(viewModel.totalReviewCount)}"

tools:text="287 avaliacoes" />
<TextView

android:id="@+id/review_banner"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/product_rating_recommended_product"

android:visibility="@{viewModel.isRecommended? View.VISIBLE: View.GONE}" />
Two-Way Binding
public class AccountStepViewModel extends BaseObservable {



@Bindable

public String getEmail() {

return accountRequest.getId();

}



@Bindable

public String getPassword() {

return accountRequest.getPassword();

}



public void setEmail(String email) {

this.accountRequest.setId(email);

notifyPropertyChanged(BR.email);

}



public void setPassword(String password) {

this.accountRequest.setPassword(password);

notifyPropertyChanged(BR.password);

}

}
<android.support.design.widget.TextInputEditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@={account.email}"

android:singleLine="true"

android:inputType="textEmailAddress"

android:hint="E-mail"/>
Binding Adapter
@Bindable

public String getImageUrl() {

return line.getProductImage();

}
@BindingAdapter({"imageUrl"})

public static void loadImage(ImageView view,
String imageUrl) {

Picasso.with(view.getContext())

.load(imageUrl)

.into(view);

}
<ImageView

android:id=“@+id/item_image”

android:layout_width="94dp"

android:layout_height="94dp"

app:imageUrl="@{viewModel.imageUrl}"

tools:src="@mipmap/ic_launcher" />
Binding Adapter
@BindingAdapter({"font"})

public static void setFont(TextView textView, String fontName) {

if (fontMap.isEmpty()) {

AssetManager assetManager = textView.getContext().getAssets();



fontMap.put("hind-bold", Typeface.createFromAsset(assetManager, "fonts/Hind-Bold.ttf"));

fontMap.put("hind-light", Typeface.createFromAsset(assetManager, "fonts/Hind-Light.ttf"));

fontMap.put("hind-medium", Typeface.createFromAsset(assetManager, "fonts/Hind-Medium.ttf"));

fontMap.put("hind-regular", Typeface.createFromAsset(assetManager, "fonts/Hind-Regular.ttf"));

fontMap.put("hind-semibold", Typeface.createFromAsset(assetManager, "fonts/Hind-Semibold.ttf"));

}



textView.setTypeface(fontMap.get(fontName));

}
<TextView

android:id="@+id/product_basic_info_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/product_basic_info_seller_label"

app:font="@{`hind-semibold`}"

android:text="@{viewModel.productName}"

android:textColor="@color/black"

android:textSize="15sp"

android:textStyle=“bold”
/>
Exemplo de Arquitetura
A. Dentre arquiteturas mais conhecidas, temos MVC (Model-View-Controller), MVP
(Model-View-Presenter) e MVVM (Model-View-View Model)
B. Optamos por seguir o modelo MVVM, com o Databinding fazendo papel de VM
C. Neste modelo, um VM é uma classe que representa uma tela qualquer, contendo
todo o seu estado
D. Essa abordagem nos dá: Testabilidade, Menos Código, Separação de Conceitos
Exemplo de Arquitetura
1. Testabilidade:
1. testes unitários nas classes de VM garantem a exibição correta dos
layouts
2. Menos código
1. muito menos código é necessário para integrar lógica e layout
2. não só exibição de valores, mas também handlers, estilização e
coisas mais avançadas
3. Separação de conceitos
1. a fronteira entre lógica de visualização e lógica de negócios fica bem
mais definida, sem “vazamento” para outras camadas
View
View
Model Model
XML
Activity/Fragment
Databinding
Lógica de controle da apresentação
Lógica de estado da View
Objetos de domínio
Lógica de negócios
APIs
Testes
Unitários
Testes
Unitários
Testes UI
Exemplo de Arquitetura
Exemplo de Arquitetura
Layout
Activity/Fragment API Client
Rx Retrofit
APIs Externas
Model
View Model
Dúvidas?
Obrigado!

Mais conteúdo relacionado

Semelhante a Android DevConference - Data Binding: Código limpo, manutenção garantida

Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TVAécio Costa
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileVitor Albuquerque
 
Usando React Native & Multi Módulos para Escalar App Creditas
Usando React Native & Multi Módulos para Escalar App CreditasUsando React Native & Multi Módulos para Escalar App Creditas
Usando React Native & Multi Módulos para Escalar App CreditasJuliana Chahoud
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi SaturninoLevi Saturnino
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexEric Cavalcanti
 
Material Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu AppMaterial Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu Appalissin
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptxRicardo Ogliari
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaJosué Rockefeller
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaJosué Rockefeller
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Da introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidDa introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidRicardo Longa
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2lfernandomcj
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Da introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidDa introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidRodolfo Faquin Della Justina
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScriptHeider Lopes
 

Semelhante a Android DevConference - Data Binding: Código limpo, manutenção garantida (20)

Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TV
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG Mobile
 
Usando React Native & Multi Módulos para Escalar App Creditas
Usando React Native & Multi Módulos para Escalar App CreditasUsando React Native & Multi Módulos para Escalar App Creditas
Usando React Native & Multi Módulos para Escalar App Creditas
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi Saturnino
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações Flex
 
Material Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu AppMaterial Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu App
 
Android + firebase
Android + firebaseAndroid + firebase
Android + firebase
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Da introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidDa introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento Android
 
O poder das Progressive Web Apps
O poder das Progressive Web AppsO poder das Progressive Web Apps
O poder das Progressive Web Apps
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Da introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento AndroidDa introdução à prática no desenvolvimento Android
Da introdução à prática no desenvolvimento Android
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Android DevConference - Data Binding: Código limpo, manutenção garantida

  • 1. Data Binding Francisco Cavedon Coordenador Técnico @ B2W Digital francisco.cavedon@b2wdigital.com
  • 2. B2W Digital Informação Institucional Pendente de Aprovação
  • 3. Agenda 1. Sobre Data Binding 2. Configuração 3. Data Binding na Prática 4. Expression Language 5. Two-Way Binding 6. Binding Adapter 7. Exemplo de Arquitetura 8. Dúvidas?
  • 4. O que é Data Binding? 1. Lançado no I/O 2015 2. “Angular para Android” 3. Layouts declarativos 4. Minimiza a necessidade de “cola” entre layout e lógica
  • 5. Porque usar? 1. Separação de responsabilidades 1. Lógica de visualização fica no layout 2. Testabilidade 3. Simplificar a relação layout-código 1. Chega de findViewById! 2. Expression Language
  • 7. Data Binding na Prática <layout>
 <android.support.design.widget.CoordinatorLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:fitsSystemWindows="true"
 tools:context=".activity.MainActivity">
 
 <include
 android:id="@+id/include_search_appbar"
 layout="@layout/include_search_appbar"/>
 
 <fragment
 android:id="@+id/home_container"
 android:name=".fragment.HomeFragment"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:layout="@layout/fragment_home" />
 
 </android.support.design.widget.CoordinatorLayout>
 </layout>
  • 8. Data Binding na Prática <layout>
 <android.support.design.widget.AppBarLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 
 <android.support.v7.widget.Toolbar
 android:id="@+id/toolbar"
 android:layout_width="match_parent"
 android:layout_height="?attr/actionBarSize"
 android:background="?attr/colorPrimary"
 app:contentInsetEnd="8dp"
 app:contentInsetStart="8dp"
 app:popupTheme="@style/AppTheme.PopupOverlay">
 … 
 </android.support.v7.widget.Toolbar>
 </android.support.design.widget.AppBarLayout>
 </layout>
  • 9. Data Binding na Prática ActivityMainBinding activityMainBinding;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
 
 Toolbar toolbar = activityMainBinding.includeSearchAppbar.toolbar;
 setSupportActionBar(toolbar);
 }
  • 10. Data Binding na Prática <layout>
 <data>
 <variable name=“filterItem” type="model.item.filter.FilterItemViewModel"/>
 </data>
 
 <RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 
 <TextView android:id="@+id/filter_name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{filterItem.name}"/>
 
 <TextView android:id="@+id/filter_item_quantity"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@{filterItem.itemQuantity}"/>
 
 </RelativeLayout>
 </layout>
  • 11. Data Binding na Prática public class SampleFilter extends RelativeLayout {
 
 ViewFilterItemBinding filterItemBinding;
 
 public SampleFilter(Context context) {
 super(context);
 
 filterItemBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.view_filter_item, null, true);
 }
 
 public void setFilter(FilterItemViewModel viewModel) {
 filterItemBinding.setFilterItem(viewModel);
 }
 } … SampleFilter sampleFilter = new SampleFilter(context);
 sampleFilter.setFilter(viewModel);
  • 12. Expression Language <TextView
 android:id="@+id/review_result_positive_feedback"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text=“@{@plurals/feedback_count(viewModel.positiveFeedback)}”
 tools:text="10 pessoas curtiram isso" /> <TextView
 android:id="@+id/rating_total_count"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@{@string/rating_total_count(viewModel.totalReviewCount)}"
 tools:text="287 avaliacoes" /> <TextView
 android:id="@+id/review_banner"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/product_rating_recommended_product"
 android:visibility="@{viewModel.isRecommended? View.VISIBLE: View.GONE}" />
  • 13. Two-Way Binding public class AccountStepViewModel extends BaseObservable {
 
 @Bindable
 public String getEmail() {
 return accountRequest.getId();
 }
 
 @Bindable
 public String getPassword() {
 return accountRequest.getPassword();
 }
 
 public void setEmail(String email) {
 this.accountRequest.setId(email);
 notifyPropertyChanged(BR.email);
 }
 
 public void setPassword(String password) {
 this.accountRequest.setPassword(password);
 notifyPropertyChanged(BR.password);
 }
 } <android.support.design.widget.TextInputEditText
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@={account.email}"
 android:singleLine="true"
 android:inputType="textEmailAddress"
 android:hint="E-mail"/>
  • 14. Binding Adapter @Bindable
 public String getImageUrl() {
 return line.getProductImage();
 } @BindingAdapter({"imageUrl"})
 public static void loadImage(ImageView view, String imageUrl) {
 Picasso.with(view.getContext())
 .load(imageUrl)
 .into(view);
 } <ImageView
 android:id=“@+id/item_image”
 android:layout_width="94dp"
 android:layout_height="94dp"
 app:imageUrl="@{viewModel.imageUrl}"
 tools:src="@mipmap/ic_launcher" />
  • 15. Binding Adapter @BindingAdapter({"font"})
 public static void setFont(TextView textView, String fontName) {
 if (fontMap.isEmpty()) {
 AssetManager assetManager = textView.getContext().getAssets();
 
 fontMap.put("hind-bold", Typeface.createFromAsset(assetManager, "fonts/Hind-Bold.ttf"));
 fontMap.put("hind-light", Typeface.createFromAsset(assetManager, "fonts/Hind-Light.ttf"));
 fontMap.put("hind-medium", Typeface.createFromAsset(assetManager, "fonts/Hind-Medium.ttf"));
 fontMap.put("hind-regular", Typeface.createFromAsset(assetManager, "fonts/Hind-Regular.ttf"));
 fontMap.put("hind-semibold", Typeface.createFromAsset(assetManager, "fonts/Hind-Semibold.ttf"));
 }
 
 textView.setTypeface(fontMap.get(fontName));
 } <TextView
 android:id="@+id/product_basic_info_name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@id/product_basic_info_seller_label"
 app:font="@{`hind-semibold`}"
 android:text="@{viewModel.productName}"
 android:textColor="@color/black"
 android:textSize="15sp"
 android:textStyle=“bold” />
  • 16. Exemplo de Arquitetura A. Dentre arquiteturas mais conhecidas, temos MVC (Model-View-Controller), MVP (Model-View-Presenter) e MVVM (Model-View-View Model) B. Optamos por seguir o modelo MVVM, com o Databinding fazendo papel de VM C. Neste modelo, um VM é uma classe que representa uma tela qualquer, contendo todo o seu estado D. Essa abordagem nos dá: Testabilidade, Menos Código, Separação de Conceitos
  • 17. Exemplo de Arquitetura 1. Testabilidade: 1. testes unitários nas classes de VM garantem a exibição correta dos layouts 2. Menos código 1. muito menos código é necessário para integrar lógica e layout 2. não só exibição de valores, mas também handlers, estilização e coisas mais avançadas 3. Separação de conceitos 1. a fronteira entre lógica de visualização e lógica de negócios fica bem mais definida, sem “vazamento” para outras camadas
  • 18. View View Model Model XML Activity/Fragment Databinding Lógica de controle da apresentação Lógica de estado da View Objetos de domínio Lógica de negócios APIs Testes Unitários Testes Unitários Testes UI Exemplo de Arquitetura
  • 19. Exemplo de Arquitetura Layout Activity/Fragment API Client Rx Retrofit APIs Externas Model View Model