Slides:
goo.gl/Vfc9cE
Sample app project:
goo.gl/BYpPn9
Document
Android Data Binding
Speaker
Mattia Aracne
Introduzione�Android Views (1/2)
TextView textView = (TextView) findViewById(R.id.textView);
EditText editText = (EditText) findViewById(R.id.editText);
� ImageView imageView = (ImageView) findViewById(R.id.imageView);
…
30/05/2016
Mattia Aracne
Android Data Binding
Introduzione�Android Views (2/2)
Product product = getProduct();�� textView.setText(product.getName());�� imageView.setImageDrawable(product.getImage());
…
30/05/2016
Mattia Aracne
Android Data Binding
Introduzione�Data Binding
«Data binding is a general technique that binds data sources from the provider and consumer together and synchronizes them»
MVVM architectural pattern
30/05/2016
Mattia Aracne
Android Data Binding
Introduzione�Android Data Binding
«The Data Binding Library allows you to write declarative layouts and minimize the glue code necessary to bind your data and layouts»
Introdotto al Google I/O 2015 (maggio), rilasciato in autunno
30/05/2016
Mattia Aracne
Android Data Binding
Introduzione�Nel concreto
La libreria genera a compile time una classe binding per ogni layout; una sorta di “collegamento” tra l’XML e l’Activity/Fragment. Questa classe contiene:
30/05/2016
Mattia Aracne
Android Data Binding
Setup�Requisiti
Android Froyo 2.1 (API level 7)
Android Studio 1.3.0+
Modifica al file gradle del modulo app del tuo progetto:
android {� …� dataBinding {� enabled = true� }� }
30/05/2016
Mattia Aracne
Android Data Binding
Esempio�Preparare il model
Before
After
1
2
3
public class Product {�� private ObservableField<String>
name = new ObservableField<>();
� public String getName() {� return name.get();� }�� public void setName(String name) {� this.name.set(name);� }
�}
public class Product {�� private String name;
�� public String getName() {� return name;� }�� public void setName(String name) {� this.name = name;� }
�}
30/05/2016
Mattia Aracne
Android Data Binding
Esempio�Preparare il layout
Before
After
1
2
3
4
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">� � <TextView� android:id="@+id/textView"
android:layout_width="wrap_content"� android:layout_height="wrap_content" />�
�</FrameLayout>
<layout>� <data class="ProductActivityBinding">� <variable name="product"
type="com.example.model.Product" />� </data>� � <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">�� <TextView� android:id="@+id/textView"� android:layout_width="wrap_content"� android:layout_height="wrap_content"� android:text="@{product.name}" />�� </FrameLayout>��</layout>
30/05/2016
Mattia Aracne
Android Data Binding
Esempio�Collegare model e layout
Before
After
1
2
4
3
public class ProductActivity extends Activity {� � TextView textView;�� @Override protected void onCreate(…) {� super.onCreate(…);
� setContentView(
R.layout.activity_product);� textView = (TextView)
findViewById(R.id.textView);� textView.requestFocus();
� Product product =
Somewhere.getProduct();� textView.setText(product.getName());� }
}
public class ProductActivity extends Activity {�� ProductActivityBinding binding;�� @Override protected void onCreate(…) {� super.onCreate(…);�� binding = DataBindingUtil
.setContentView(this,
R.layout.activity_product);�
binding.textView.requestFocus();
� Product product =
Somewhere.getProduct();� binding.setProduct(product);
}�}
30/05/2016
Mattia Aracne
Android Data Binding
Risultato
Da questo momento tutte le modifiche delle variabili collegate al binding causeranno un aggiornamento automatico delle view corrispondenti (come specificato nel layout):
product.setName("Un prodotto modificato");
30/05/2016
Mattia Aracne
Android Data Binding
Neat, isn’t it?
30/05/2016
Mattia Aracne
Android Data Binding
Features
Espressioni
Le espressioni somigliano molto a quelle Java:
30/05/2016
Mattia Aracne
Android Data Binding
Features
Imports (1/2)
Si possono importare classi per usarne le costanti:
<data>� <import type="android.view.View"/>� </data>
<TextView
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
30/05/2016
Mattia Aracne
Android Data Binding
Features
Imports (2/2)
Si possono importare classi per usarne i metodi statici:
<data>� <import type="com.example.MyStringUtils"/>� <variable name="user" type="com.example.User"/>� </data>
<TextView� android:text="@{MyStringUtils.capitalize(user.lastName)}"� android:layout_width="wrap_content"� android:layout_height="wrap_content"/>
30/05/2016
Mattia Aracne
Android Data Binding
Features
Collections
<data>� <import type="android.util.SparseArray"/>� <import type="java.util.Map"/>� <import type="java.util.List"/>� <variable name="list" type="List<String>"/>� <variable name="sparse" type="SparseArray<String>"/>� <variable name="map" type="Map<String, String>"/>� <variable name="index" type="int"/>� <variable name="key" type="String"/>� </data>
<TextView� android:text="@{list[index]}" … />
<TextView� android:text="@{sparse[index]}" … />
<TextView� android:text="@{map[key]}" … />�
30/05/2016
Mattia Aracne
Android Data Binding
Features
Resources (1/3)
È possibile accedere alle risorse, in questo caso ad una dimension:
res/dimens.xml
<resources>� <dimen name="smallPadding">8dp</dimen>� <dimen name="largePadding">16dp</dimen>� </resources>
<View� android:padding="@{large ? @dimen/largePadding : @dimen/smallPadding}"� … />
30/05/2016
Mattia Aracne
Android Data Binding
Features
Resources (2/3)
È possibile accedere alle risorse, in questo caso ad una string:
res/strings.xml
<resources>� <string name="price_format">€ %.2f</dimen>� </resources>
<TextView� android:text="@{@string/price_format(product.price)}"� … />
30/05/2016
Mattia Aracne
Android Data Binding
Features
Resources (3/3)
È possibile accedere alle risorse, in questo caso ad un plural:
res/strings.xml
<plurals name="avail">� <item quantity="one">Un\'unità disponibile</item>� <item quantity="other">%d unità disponibili</item>� </plurals>
<TextView� android:text="@{@plurals/avail(product.quantity, product.quantity)}"� … />
30/05/2016
Mattia Aracne
Android Data Binding
Features
BindingAdapter
La libreria vi permette di creare facilmente nuovi attributi per qualsiasi view.
Ad es, in un qualsiasi package creiamo questa classe:
Ora, in qualsiasi layout:
NB: Vi permette anche di sovrascrivere gli attributi del namespace android!
public class Bindings {� @BindingAdapter("imageUrl")� public static void loadImage(ImageView view, String url) {� Picasso.with(view.getContext()).load(url).into(view);� }� }
<layout xmlns:android="http://schemas.android.com/apk/res/android"� xmlns:app="http://schemas.android.com/apk/res-auto">� <ImageView app:imageUrl="@{product.imageUrl}" … />� </layout>
30/05/2016
Mattia Aracne
Android Data Binding
Features
BindingMethods
La libreria vi permette mappare attributi su metodi specifici.
Ad es, capita che ad un attributo non corrisponda un setter con lo stesso nome. È il caso di android:onClick ma anche di android:tint.
Possiamo risolvere così:
@BindingMethods({
@BindingMethod(type = "android.widget.View.class",� attribute = "android:onClick",� method = "setOnClickListener"),� @BindingMethod(type = "android.widget.ImageView.class",� attribute = "android:tint",� method = "setImageTintList")� })� public class Bindings {
…
}
30/05/2016
Mattia Aracne
Android Data Binding
Features
Binding Events
public class MyHandlers {� public void onClickBuy(View view) { ... }� public void onClickDiscount(View view) { ... }� }
<layout xmlns:android="http://schemas.android.com/apk/res/android">� <data>� <variable name="handlers" type="com.example.MyHandlers" />� <variable name="product" type="com.example.Product" />� </data>� <LinearLayout … >� <TextView android:layout_width="wrap_content"� android:layout_height="wrap_content"� android:text="@{user.firstName}"� android:onClick="@{product.isDiscounted ?
handlers.onClickDiscount : handlers.onClickBuy}" />� </LinearLayout>�</layout>
30/05/2016
Mattia Aracne
Android Data Binding
Features
Two-way binding
Ora è anche possibile ricevere i cambiamenti dei dati dalle View usando la notazione at-equal:
Per gli attributi più diffusi funziona out-of-the-box.
AbsListView android:selectedItemPosition
CalendarView android:date
CompoundButton android:checked
DatePicker android:year, android:month, android:day
NumberPicker android:value
RadioGroup android:checkedButton
Si può crearne di propri usando le annotazioni @InverseBindingMethod e @InverseBindingAdapter.
RatingBar android:rating
SeekBar android:progress
TabHost android:currentTab
TextView android:text
TimePicker android:hour, android:minute
<EditText android:text="@={product.name}" … />
NEW
30/05/2016
Mattia Aracne
Android Data Binding
Features
Much more...
…
30/05/2016
Mattia Aracne
Android Data Binding
Appendice�Video tutorial (1/2)
Data Binding -- Write Apps Faster�Android Dev Summit 2015 (novembre)
30/05/2016
Mattia Aracne
Android Data Binding
Appendice�Video tutorial (2/2)
Advanced Data Binding�Google I/O 2016 (maggio)
30/05/2016
Mattia Aracne
Android Data Binding
Grazie per l’attenzione!��Domande?
linkedin.com/in/maracne