Thông thường, để làm việc với các điều khiển (views) trên giao diện Android chúng ta cần xác định thuộc tính id của các điều khiển này thông qua phương thức findViewById(). Với các ứng dụng lớn cách thức này thường chậm và không an toàn vì nó không được kiểm tra tại thời điểm biên dịch, đó là chưa kể đến tình huống nhập sai id của điều khiển sẽ dẫn đến ứng dụng bị dừng đột ngột tại thời điểm chạy. Một giải pháp hiệu quả hơn là kỹ thuật data binding.

Ứng dụng không dùng Data Binding

Trước khi khám phá kỹ thuật data binding chúng ta sẽ tạo một ứng dụng Android đơn giản sử dụng hàm findViewById(). Ứng dụng được tạo và thực thi trong môi trường Android Studio 3.6.1 dùng ngôn ngữ Java. Ứng dụng tên MyDataBinding với giao diện gồm các view sau:

View Thuộc tính id Thuộc tính text
Button btnName Change Name
TextView txtName Để trống
PlainText (EditText) plName Để trống

Mở tập tin MainActivity.java, trong lớp MainActivity định nghĩa hai biến và khởi tạo hai biến txtName plName trong phương thức onCreate() như sau:

TextView txtName;
EditText plName;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  txtName = (TextView)findViewById(R.id.txtName);
  plName = (EditText) findViewById(R.id.plName);
}

Định nghĩa một hàm Change_Name trong lớp MainActivity như sau:

public void Change_Name(View v){
   txtName.setText(plName.getText().toString());
}

Trong tập tin activity_main.xml ở chế độ Code tìm đến định nghĩa <Button> và thêm thuộc tính onClick với giá trị là hàm Change_Name:

<Button
   android:id="@+id/btnName"
   android:text="Change Name"
   android:onClick="Change_Name"
   ... />

Lưu tất cả và thực thi ứng dụng với máy ảo. Nhập thông tin vào PlainText và nhấn nút Change Name sẽ hiển thị thông tin vừa nhập đến TextView.

Ứng dụng dùng Data Binding

Bây giờ chúng ta sẽ điều chỉnh ứng dụng MyDataBinding ở trên dùng kỹ thuật data binding nhưng đầu tiên chúng ta cần bật chức năng data binding bằng cách tìm đến Gradle Scripts trong cửa sổ Project, mở tập tin build.gradle (Module:app) và thêm đoạn khai báo trong android:

android {
  ...
  dataBinding {
     enabled true
  }
}

Lưu và đóng tập tin.  Kế tiếp là chuyển layout mặc định của giao diện ứng dụng (mặc định là ConstraintLayout) sang Data Binding layout và tập tin activity_main.xml lúc này:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools">

   <data>
   </data>

   <androidx.constraintlayout.widget.ConstraintLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".MainActivity">

        <TextView ... />

        <EditText ... />

        <Button ... />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Layout mặc định của chúng ta (ConstraintLayout) được bọc bởi Data Binding layout (layout). Trong phần tử <data> thêm hai phần tử <variable> sau:

<data>
  <variable name="txtName" type="String"/>
  <variable name="plName" type="String"/>
</data>

Lúc này chúng ta sẽ có hai biến là txtNameplName. Bây giờ chúng ta chỉ việc kết buộc hai biến này đến hai điều khiển tương ứng trong giao diện bằng cách mở tập tin activity_main.xml và khai báo thuộc tính text của TextViewPlainText (hay EditText) như sau:

<TextView
   android:id="@+id/txtName"
   android:text="@{txtName}"
   .../>

<EditText
   android:id="@+id/plName"
   android:text="@{plName}"
   ... />

Các biến txtNameplName được kết buộc đến hai view thông qua thuộc tính text bằng cách dùng cú pháp @{ tên biến }. Lúc này chúng ta không cần dùng hàm findViewById() trong lớp MainActivity mà sẽ định nghĩa biến binding như sau:

ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
}

Hàm Change_Name được thay đổi:

public void Change_Name(View v){
   binding.txtName.setText(binding.plName.getText().toString());
}

Các biến txtNameplName sau khi được kết buộc đến các view sẽ được sử dụng thông qua một đối tượng lớp ActivityMainBinding.

Lưu tất cả và thực thi lại ứng dụng sẽ thấy kết quả tương tự khi chưa dùng Data Binding. Cách tạo và thực thi ứng dụng MyDataBinding dùng kỹ thuật Data Binding có thể tham khảo từ video sau: