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 và 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à txtName và plName. 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 TextView và PlainText (hay EditText) như sau:
<TextView android:id="@+id/txtName" android:text="@{txtName}" .../> <EditText android:id="@+id/plName" android:text="@{plName}" ... />
Các biến txtName và plName đượ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 txtName và plName 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:
Ý kiến bài viết