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

PPTX
Desvendando as ferramentas e serviços para o desenvolvedor Android
PPTX
Windows Azure 5/8 - Recursos adicionais do Windows Azure
PDF
Vraptor
PPTX
Persistência com JPA e Hibernate
PDF
Wicket 2008
PDF
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
PPTX
Explorando a API Rest Jira Cloud
PDF
One Language to Rule Them All: TypeScript
Desvendando as ferramentas e serviços para o desenvolvedor Android
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Vraptor
Persistência com JPA e Hibernate
Wicket 2008
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Explorando a API Rest Jira Cloud
One Language to Rule Them All: TypeScript

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

PDF
Desenvolvendo aplicacoes mobile_com_html_css_
PPT
Introdução ao Google TV
PDF
Intervalo Técnico - QG Mobile
PDF
Usando React Native & Multi Módulos para Escalar App Creditas
PPTX
Data Binding Android - Levi Saturnino
PPTX
Utilizando o Padrão Presentation Model em Aplicações Flex
PPTX
Material Design - Melhorando a experiência de seu App
PDF
Android + firebase
PDF
Aula 1 view model livedata e databinding.pptx
PDF
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
PDF
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
PDF
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
PDF
Desenvolvimento de aplicações para o Google App Engine
PPTX
Aula_4_com_codigo_completo_comentado.pptx
PPT
Da introdução à prática no desenvolvimento Android
PDF
O poder das Progressive Web Apps
PPT
Minicurso code igniter aula 2
PDF
Programando para programadores: Desafios na evolução de um Framework
PPT
Da introdução à prática no desenvolvimento Android
PDF
Java e Cloud Computing
Desenvolvendo aplicacoes mobile_com_html_css_
Introdução ao Google TV
Intervalo Técnico - QG Mobile
Usando React Native & Multi Módulos para Escalar App Creditas
Data Binding Android - Levi Saturnino
Utilizando o Padrão Presentation Model em Aplicações Flex
Material Design - Melhorando a experiência de seu App
Android + firebase
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ática
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de aplicações para o Google App Engine
Aula_4_com_codigo_completo_comentado.pptx
Da introdução à prática no desenvolvimento Android
O poder das Progressive Web Apps
Minicurso code igniter aula 2
Programando para programadores: Desafios na evolução de um Framework
Da introdução à prática no desenvolvimento Android
Java e Cloud Computing
Anúncio

Mais de iMasters (20)

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

Último (20)

DOCX
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
PPTX
Politicas-de-Seguranca-Privacidade-e-Cookies.pptx
PDF
Processamento da remessa no SAP ERP, SCM610 Col15
PPTX
Introdução a Computação em Nuvem-parte2-T2
PDF
Personalização de tópicos adicionais no SAP Extended Warehouse Management, EW...
PDF
POO - Aula 03 - Membros Estáticos e Construtores.pdf
PDF
resumo de instalação de placa arduino em jardim vertical para fertirrigação
PPTX
Do código à carreira: O Profissional de TI que o mercado realmente quer - com...
PDF
POO - Aula 05 - Herança - Generalização e Especialização.pdf
PDF
pdfcoffee.com_metalografia-25-pdf-free.pdf
PPTX
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
PDF
POO - Aula 05 - Herança - Generalização e Especialização.pdf
PPTX
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
PDF
Aula 9 - Funções 202yttvrcrg5-1.pptx.pdf
PDF
instalacoes eletricas para industria apressentacao basicas
PPTX
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
PPT
inteligencia_artificial REPRESENTAÇÃO DO CONHECECIMENTO
PDF
Arquitetura de Software slides sommerville
PPTX
Legislação aeronautica na aviação civil Brasileira
PDF
Capacitação em Logística – Instituto Federal
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
Politicas-de-Seguranca-Privacidade-e-Cookies.pptx
Processamento da remessa no SAP ERP, SCM610 Col15
Introdução a Computação em Nuvem-parte2-T2
Personalização de tópicos adicionais no SAP Extended Warehouse Management, EW...
POO - Aula 03 - Membros Estáticos e Construtores.pdf
resumo de instalação de placa arduino em jardim vertical para fertirrigação
Do código à carreira: O Profissional de TI que o mercado realmente quer - com...
POO - Aula 05 - Herança - Generalização e Especialização.pdf
pdfcoffee.com_metalografia-25-pdf-free.pdf
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
POO - Aula 05 - Herança - Generalização e Especialização.pdf
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
Aula 9 - Funções 202yttvrcrg5-1.pptx.pdf
instalacoes eletricas para industria apressentacao basicas
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
inteligencia_artificial REPRESENTAÇÃO DO CONHECECIMENTO
Arquitetura de Software slides sommerville
Legislação aeronautica na aviação civil Brasileira
Capacitação em Logística – Instituto Federal

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

  • 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