Android DataBindings
Post date: Feb 23, 2016 9:49:48 AM
Data binding is an excellent feature introduced in android to implement real MVVM pattern in mobile application developments.
1. Enable data binding
Open build.gradle and add following configuration in it.
android {
.....
dataBinding{
enabled = true
}
.....
}
Observable Object:
A POJO class which is extent from BaseObservable object is called as observable object which can be directly bind to any xml files in android
Getter method of each property fields in this POJO class should have @Bindable annotation
Setter method of each property field in the POJO class should notify the property change through "notifyPropertyChanged" method.
"BR" is a auto generated enum for each properity fields which has @Bindable annotation
package bob.bindme.model;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import bob.bindme.BR;
/**
* Created by boobalanmunusamy on 2/23/16.
*/
public class CEmployee extends BaseObservable {
private String userName;
private String password;
private String address;
private String emailAddress;
@Bindable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}
@Bindable
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
notifyPropertyChanged(BR.password);
}
@Bindable
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
notifyPropertyChanged(BR.address);
}
@Bindable
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
notifyPropertyChanged(BR.emailAddress);
}
}
2. Move default activity xml codes inside the <layout></layout> tag
Normal Activity XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="bob.bindme.LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="bob.bindme.LoginActivity"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_weight=".3"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="User Name" android:padding="10dp"
android:id="@+id/textView" />
<EditText
android:layout_width="0dp"
android:layout_weight=".7"
android:layout_height="wrap_content"
android:id="@+id/etUserName" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0dp"
android:layout_weight=".3"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Password"
android:padding="10dp"
android:id="@+id/txtPassword" />
<EditText
android:layout_width="0dp"
android:layout_weight=".7"
android:layout_height="wrap_content"
android:password="true"
android:id="@+id/etPassword" />
</LinearLayout>
<Button
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="wrap_content"
android:text="Login"
android:id="@+id/btnLogin" />
</LinearLayout>
</RelativeLayout>
Updated XML file has been mentioned below;
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="employeeInfo"
type="bob.bindme.model.CEmployee"/>
</data>
<RelativeLayout android:layout_width ="match_parent" android:layout_height= "match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".activity.LoginActivity"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_weight=".3"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="User Name" android:padding="10dp"
android:id="@+id/textView" />
<EditText
android:layout_width="0dp"
android:layout_weight=".7"
android:layout_height="wrap_content"
android:text="@{employeeInfo.userName}"
android:id="@+id/etUserName" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0dp"
android:layout_weight=".3"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Password"
android:padding="10dp"
android:id="@+id/txtPassword" />
<EditText
android:layout_width="0dp"
android:layout_weight=".7"
android:layout_height="wrap_content"
android:password="true"
android:text="@{employeeInfo.password}"
android:id="@+id/etPassword" />
</LinearLayout>
<Button
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="wrap_content"
android:text="Login"
android:onClick="onLoginButtonClicked"
android:id="@+id/btnLogin" />
</LinearLayout>
</RelativeLayout>
</layout>
Binding Data
By default, a Binding class will be generated based on the name of the layout file, converting it to Pascal case and suffixing “Binding” to it. The above layout file was activity_login.xml so the generate class was ActivityLoginBinding. This class holds all the bindings from the layout properties (e.g. the user variable) to the layout’s Views and knows how to assign values for the binding expressions.The easiest means for creating the bindings is to do it while inflating:
public class LoginActivity extends AppCompatActivity {
CEmployee cEmployee;
ActivityLoginBinding activityLoginBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
cEmployee = new CEmployee();
activityLoginBinding.setEmployeeInfo(cEmployee);
}
}