1 of 28

Slides:

goo.gl/Vfc9cE

Sample app project:

goo.gl/BYpPn9

2 of 28

Document

Android Data Binding

Speaker

Mattia Aracne

3 of 28

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

4 of 28

Introduzione�Android Views (2/2)

Product product = getProduct();�� textView.setText(product.getName());�� imageView.setImageDrawable(product.getImage());

30/05/2016

Mattia Aracne

Android Data Binding

5 of 28

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

6 of 28

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

7 of 28

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:

  • Variabili final per ogni view del layout che possiede un id�
  • Setter/Getter per ogni variabile dichiarata nel layout

30/05/2016

Mattia Aracne

Android Data Binding

8 of 28

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

9 of 28

EsempioPreparare 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

10 of 28

EsempioPreparare 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

11 of 28

EsempioCollegare 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

12 of 28

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

13 of 28

Neat, isn’t it?

30/05/2016

Mattia Aracne

Android Data Binding

14 of 28

Features

Espressioni

Le espressioni somigliano molto a quelle Java:

  • Mathematical + - / * %
  • String concatenation +
  • Logical && ||
  • Binary & | ^
  • Unary + - ! ~
  • Shift >> >>> <<
  • Comparison == > < >= <=
  • instanceof
  • Grouping ()
  • Literals - character, String, numeric, null
  • Cast
  • Method calls
  • Field access
  • Array access []
  • Ternary operator ?:

30/05/2016

Mattia Aracne

Android Data Binding

15 of 28

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

16 of 28

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

17 of 28

Features

Collections

<data><import type="android.util.SparseArray"/><import type="java.util.Map"/><import type="java.util.List"/><variable name="list" type="List&lt;String>"/><variable name="sparse" type="SparseArray&lt;String>"/><variable name="map" type="Map&lt;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

18 of 28

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

19 of 28

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

20 of 28

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

21 of 28

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

22 of 28

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

23 of 28

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

24 of 28

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

25 of 28

Features

Much more...

  • Uso in combinazione con ListView/RecyclerView Adapter�
  • Font personalizzati per TextView (suggerimento: BindingAdapter)�
  • Expression chaining�
  • Lamba expressions / Method references�
  • Animations�
  • Dependency injection (testing)

30/05/2016

Mattia Aracne

Android Data Binding

26 of 28

Appendice�Video tutorial (1/2)

Data Binding -- Write Apps Faster�Android Dev Summit 2015 (novembre)

30/05/2016

Mattia Aracne

Android Data Binding

27 of 28

Appendice�Video tutorial (2/2)

Advanced Data Binding�Google I/O 2016 (maggio)

30/05/2016

Mattia Aracne

Android Data Binding

28 of 28

Grazie per l’attenzione!��Domande?

linkedin.com/in/maracne