Ngôn ngữ biểu thức cho phép bạn viết các biểu thức xử lý các sự kiện do khung hiển thị gửi đi. Thư viện liên kết dữ liệu tự động tạo các lớp cần thiết để liên kết khung hiển thị trong bố cục với đối tượng dữ liệu của bạn.
Các tệp bố cục liên kết dữ liệu hơi khác nhau và bắt đầu bằng thẻ gốc là layout
, sau đó là thành phần data
và thành phần gốc view
. Phần tử khung hiển thị này là phần tử gốc của bạn trong một tệp bố cục không liên kết. Mã sau đây cho thấy một tệp bố cục mẫu:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
Biến user
trong data
mô tả một thuộc tính có thể dùng trong bố cục này:
<variable name="user" type="com.example.User" />
Các biểu thức trong bố cục được viết trong các thuộc tính bằng cú pháp @{}
. Trong ví dụ sau, văn bản TextView
được đặt thành thuộc tính firstName
của biến user
:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
Đối tượng dữ liệu
Giả sử bạn có một đối tượng thuần tuý để mô tả thực thể User
:
Kotlin
data class User(val firstName: String, val lastName: String)
Java
public class User { public final String firstName; public final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
Loại đối tượng này có dữ liệu không bao giờ thay đổi. Thông thường, trong các ứng dụng sẽ có dữ liệu được đọc một lần và không bao giờ thay đổi sau đó. Bạn cũng có thể sử dụng một đối tượng tuân theo một tập hợp quy ước, chẳng hạn như dùng các phương thức truy cập trong ngôn ngữ lập trình Java, như minh hoạ trong ví dụ sau:
Kotlin
// Not applicable in Kotlin. data class User(val firstName: String, val lastName: String)
Java
public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } }
Từ khía cạnh liên kết dữ liệu, hai lớp này tương đương với nhau. Biểu thức @{user.firstName}
dùng cho thuộc tính android:text
truy cập vào trường firstName
trong lớp trước và phương thức getFirstName()
trong lớp sau. Giá trị này cũng được phân giải thành firstName()
, nếu có phương thức đó.
Liên kết dữ liệu
Một lớp liên kết được tạo cho mỗi tệp bố cục. Theo mặc định, tên của lớp được dựa trên tên của tệp bố cục, được chuyển đổi sang quy ước viết hoa Pascal case và thêm hậu tố Binding. Ví dụ: tên tệp bố cục trước đó là activity_main.xml
, vì vậy, lớp liên kết được tạo tương ứng là ActivityMainBinding
.
Lớp này lưu giữ mọi liên kết từ các thuộc tính bố cục (ví dụ: biến user
) với thành phần hiển thị của bố cục và biết cách gán giá trị cho các biểu thức liên kết. Bạn nên tạo các liên kết trong khi tăng cường bố cục, như trong ví dụ sau:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView( this, R.layout.activity_main) binding.user = User("Test", "User") }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User("Test", "User"); binding.setUser(user); }
Trong thời gian chạy, ứng dụng sẽ hiện người dùng Test (Kiểm thử) trong giao diện người dùng. Ngoài ra, bạn có thể lấy khung hiển thị bằng cách sử dụng LayoutInflater
, như trong ví dụ sau:
Kotlin
val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())
Java
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
Nếu đang sử dụng các mục liên kết dữ liệu bên trong bộ chuyển đổi Fragment
, ListView
hoặc RecyclerView
, bạn nên sử dụng phương thức inflate()
của các lớp liên kết hoặc lớp DataBindingUtil
, như minh hoạ trong ví dụ về mã sau:
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
Ngôn ngữ diễn đạt
Các tính năng phổ biến
Ngôn ngữ biểu thức rất giống với các biểu thức được tìm thấy trong mã được quản lý. Bạn có thể sử dụng các toán tử và từ khoá sau đây bằng ngôn ngữ biểu thức:
- Toán học:
+ - / * %
- Nối chuỗi:
+
- Lôgic:
&& ||
- Tệp nhị phân:
& | ^
- Một chữ cái:
+ - ! ~
- Chuyển:
>> >>> <<
- Phép so sánh:
== > < >= <=
(<
cần được thoát dưới dạng<
) instanceof
- Phân nhóm:
()
- Giá trị cố định, chẳng hạn như ký tự, Chuỗi, số,
null
- Truyền
- Lệnh gọi phương thức
- Quyền truy cập vào trường
- Truy cập mảng:
[]
- Toán tử ba ngôi:
?:
Dưới đây là một số ví dụ:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
Thiếu toán tử
Thiếu các toán tử sau đây trong cú pháp biểu thức mà bạn có thể sử dụng trong mã được quản lý:
this
super
new
- Lời gọi chung rõ ràng
Toán tử liên kết rỗng
Toán tử liên kết rỗng (??
) sẽ chọn toán hạng bên trái nếu không phải là null
hoặc bên phải nếu toán hạng trước đây là null
:
android:text="@{user.displayName ?? user.lastName}"
Chức năng này tương đương với chức năng sau:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Tệp tham chiếu thuộc tính
Biểu thức có thể tham chiếu đến một thuộc tính trong lớp bằng cách sử dụng định dạng sau. Định dạng này giống với các trường, phương thức getter và đối tượng ObservableField
:
android:text="@{user.lastName}"
Tránh các ngoại lệ về con trỏ rỗng
Mã liên kết dữ liệu được tạo sẽ tự động kiểm tra các giá trị null
và tránh các ngoại lệ về con trỏ rỗng. Ví dụ: trong biểu thức @{user.name}
, nếu user
có giá trị rỗng, thì user.name
sẽ được gán giá trị mặc định là null
. Nếu bạn tham chiếu user.age
, trong đó độ tuổi thuộc loại int
, thì liên kết dữ liệu sẽ sử dụng giá trị mặc định là 0
.
Xem tài liệu tham khảo
Một biểu thức có thể tham chiếu các khung hiển thị khác trong bố cục theo mã nhận dạng, bằng cách sử dụng cú pháp sau:
android:text="@{exampleText.text}"
Trong ví dụ sau, khung hiển thị TextView
tham chiếu đến một khung hiển thị EditText
trong cùng một bố cục:
<EditText
android:id="@+id/example_text"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
<TextView
android:id="@+id/example_output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{exampleText.text}"/>
Bộ sưu tập
Bạn có thể truy cập các tập hợp phổ biến, chẳng hạn như mảng, danh sách, danh sách thưa và bản đồ, bằng cách sử dụng toán tử []
để thuận tiện.
<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>
...
android:text="@{list[index]}"
...
android:text="@{sparse[index]}"
...
android:text="@{map[key]}"
Bạn cũng có thể tham chiếu đến một giá trị trong bản đồ bằng cách sử dụng ký hiệu object.key
. Ví dụ: bạn có thể thay thế @{map[key]}
trong ví dụ trước bằng @{map.key}
.
Hằng chuỗi
Bạn có thể sử dụng dấu nháy đơn để bao quanh giá trị thuộc tính, điều này cho phép bạn sử dụng dấu ngoặc kép trong biểu thức, như minh hoạ trong ví dụ sau:
android:text='@{map["firstName"]}'
Bạn cũng có thể sử dụng dấu ngoặc kép để bao quanh giá trị thuộc tính. Khi đó, giá trị cố định dạng chuỗi phải được bao quanh bằng dấu phẩy ngược `
, như minh hoạ dưới đây:
android:text="@{map[`firstName`]}"
Tài nguyên
Biểu thức có thể tham chiếu các tài nguyên ứng dụng với cú pháp sau:
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
Bạn có thể đánh giá các chuỗi định dạng và số nhiều bằng cách cung cấp các tham số:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
Bạn có thể chuyển tham chiếu thuộc tính và tham chiếu xem dưới dạng tham số tài nguyên:
android:text="@{@string/example_resource(user.lastName, exampleText.text)}"
Khi số nhiều nhận nhiều tham số, hãy chuyển tất cả các tham số:
Have an orange
Have %d oranges
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
Một số tài nguyên yêu cầu đánh giá loại rõ ràng, như hiển thị trong bảng sau:
Loại | Tham chiếu thông thường | Tham chiếu biểu thức |
---|---|---|
String[] |
@array |
@stringArray |
int[] |
@array |
@intArray |
TypedArray |
@array |
@typedArray |
Animator |
@animator |
@animator |
StateListAnimator |
@animator |
@stateListAnimator |
color int |
@color |
@color |
ColorStateList |
@color |
@colorStateList |
Xử lý sự kiện
Tính năng liên kết dữ liệu cho phép bạn viết các sự kiện xử lý biểu thức được gửi từ các khung hiển thị, ví dụ: phương thức onClick()
. Tên thuộc tính sự kiện được xác định theo tên của phương thức trình nghe, với một vài ngoại lệ. Ví dụ: View.OnClickListener
có phương thức onClick()
, vì vậy, thuộc tính của sự kiện này là android:onClick
.
Có một số trình xử lý sự kiện chuyên biệt cho sự kiện nhấp chuột cần có một thuộc tính không phải là android:onClick
để tránh xung đột. Bạn có thể sử dụng các thuộc tính sau để tránh các loại xung đột này:
Lớp | Phương thức setter của trình nghe | Thuộc tính |
---|---|---|
SearchView |
setOnSearchClickListener(View.OnClickListener) |
android:onSearchClick |
ZoomControls |
setOnZoomInClickListener(View.OnClickListener) |
android:onZoomIn |
ZoomControls |
setOnZoomOutClickListener(View.OnClickListener) |
android:onZoomOut |
Bạn có thể sử dụng 2 cơ chế này được mô tả chi tiết trong các phần tiếp theo để xử lý một sự kiện:
- Tham chiếu phương thức: trong biểu thức, bạn có thể tham chiếu các phương thức tuân thủ chữ ký của phương thức trình nghe. Khi một biểu thức đánh giá một tham chiếu phương thức, tính năng liên kết dữ liệu sẽ gói tham chiếu phương thức và đối tượng chủ sở hữu trong một trình nghe và đặt trình nghe đó trên khung hiển thị mục tiêu. Nếu biểu thức có giá trị là
null
, thì tính năng liên kết dữ liệu sẽ không tạo trình nghe mà sẽ đặt trình nghenull
. - Liên kết trình nghe: đây là các biểu thức lambda được đánh giá khi sự kiện xảy ra. Việc liên kết dữ liệu luôn tạo một trình nghe để đặt trên khung hiển thị đó. Khi sự kiện được gửi đi, trình nghe sẽ đánh giá biểu thức lambda.
Tham chiếu phương thức
Bạn có thể liên kết trực tiếp sự kiện với phương thức của trình xử lý, tương tự như cách bạn có thể
chỉ định
android:onClick
cho một
phương thức trong một hoạt động. Một lợi thế so với thuộc tính View
onClick
là biểu thức được xử lý trong thời gian biên dịch. Vì vậy, nếu phương thức này không tồn tại hoặc chữ ký của phương thức không chính xác, bạn sẽ gặp lỗi thời gian biên dịch.
Điểm khác biệt chính giữa các tham chiếu phương thức và liên kết trình nghe là quá trình triển khai trình nghe thực tế được tạo ra khi dữ liệu được liên kết, chứ không phải khi sự kiện được kích hoạt. Nếu bạn muốn đánh giá biểu thức khi sự kiện xảy ra, hãy sử dụng các liên kết trình nghe.
Để chỉ định một sự kiện cho trình xử lý của sự kiện đó, hãy sử dụng biểu thức liên kết thông thường, trong đó giá trị là tên phương thức cần gọi. Chẳng hạn hãy xem xét đối tượng dữ liệu bố cục mẫu sau:
Kotlin
class MyHandlers { fun onClickFriend(view: View) { ... } }
Java
public class MyHandlers { public void onClickFriend(View view) { ... } }
Biểu thức liên kết có thể chỉ định trình nghe lượt nhấp cho một khung hiển thị cho phương thức onClickFriend()
, như sau:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.MyHandlers"/>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:
</LinearLayout>
</layout>
Liên kết trình nghe
Liên kết trình nghe là các biểu thức liên kết sẽ chạy khi một sự kiện xảy ra. Các biểu thức này tương tự như tham chiếu phương thức, nhưng cho phép bạn chạy các biểu thức liên kết dữ liệu tuỳ ý. Tính năng này hoạt động với Trình bổ trợ Android cho Gradle dành cho Gradle phiên bản 2.0 trở lên.
Trong tệp tham chiếu phương thức, các tham số của phương thức phải khớp với các tham số của trình nghe sự kiện. Trong liên kết trình nghe, chỉ giá trị trả về phải khớp với giá trị trả về dự kiến của trình nghe, trừ phi trình nghe dự kiến có void
. Ví dụ: hãy xem xét lớp người trình bày sau đây có phương thức onSaveClick()
:
Kotlin
class Presenter { fun onSaveClick(task: Task){} }
Java
public class Presenter { public void onSaveClick(Task task){} }
Bạn có thể liên kết sự kiện nhấp chuột với phương thức onSaveClick()
như sau:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="task" type="com.android.example.Task" />
<variable name="presenter" type="com.android.example.Presenter" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android: -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>
Khi sử dụng lệnh gọi lại trong một biểu thức, tính năng liên kết dữ liệu sẽ tự động tạo trình nghe cần thiết và đăng ký trình nghe đó cho sự kiện. Khi khung hiển thị kích hoạt sự kiện, tính năng liên kết dữ liệu sẽ đánh giá biểu thức đã cho. Giống như các biểu thức liên kết thông thường, bạn sẽ nhận được độ an toàn của chuỗi và giá trị rỗng của việc liên kết dữ liệu trong khi các biểu thức của trình nghe này đang được đánh giá.
Trong ví dụ trước, tham số view
được truyền đến onClick(View)
không được xác định. Liên kết trình nghe cung cấp 2 lựa chọn cho tham số trình nghe: bạn có thể bỏ qua tất cả các tham số cho phương thức hoặc đặt tên cho tất cả các tham số đó. Nếu muốn đặt tên cho các tham số, bạn có thể sử dụng chúng trong biểu thức. Ví dụ: bạn có thể viết biểu thức trên như sau:
android: -> presenter.onSaveClick(task)}"
Nếu muốn sử dụng tham số trong biểu thức, bạn có thể làm như sau:
Kotlin
class Presenter { fun onSaveClick(view: View, task: Task){} }
Java
public class Presenter { public void onSaveClick(View view, Task task){} }
android: -> presenter.onSaveClick(theView, task)}"
Bạn cũng có thể sử dụng biểu thức lambda với nhiều tham số:
Kotlin
class Presenter { fun onCompletedChanged(task: Task, completed: Boolean){} }
Java
public class Presenter { public void onCompletedChanged(Task task, boolean completed){} }
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android: isChecked) -> presenter.completeChanged(task, isChecked)}" />
Nếu sự kiện bạn đang nghe trả về một giá trị có loại không phải là void
, thì biểu thức cũng phải trả về cùng một loại giá trị. Ví dụ: nếu bạn muốn nghe sự kiện chạm và giữ (nhấp và giữ), biểu thức của bạn phải trả về một boolean.
Kotlin
class Presenter { fun onLongClick(view: View, task: Task): Boolean { } }
Java
public class Presenter { public boolean onLongClick(View view, Task task) { } }
android: -> presenter.onLongClick(theView, task)}"
Nếu không thể đánh giá biểu thức do các đối tượng null
, thì tính năng liên kết dữ liệu sẽ trả về giá trị mặc định cho loại đó, chẳng hạn như null
cho loại tham chiếu, 0
cho int
hoặc false
cho boolean
.
Nếu cần sử dụng một biểu thức có vị từ (ví dụ: số ba ngôi), bạn có thể dùng void
làm ký hiệu:
android: -> v.isVisible() ? doSomething() : void}"
Tránh trình nghe phức tạp
Biểu thức của trình nghe có tác động mạnh mẽ và có thể giúp mã của bạn dễ đọc hơn. Mặt khác, trình nghe chứa các biểu thức phức tạp khiến bố cục của bạn khó đọc và duy trì hơn. Giữ biểu thức của bạn đơn giản như truyền dữ liệu có sẵn từ giao diện người dùng đến phương thức gọi lại. Triển khai mọi logic nghiệp vụ bên trong phương thức gọi lại mà bạn gọi từ biểu thức trình nghe.
Dữ liệu nhập, biến và bao gồm
Thư viện liên kết dữ liệu cung cấp các tính năng như lệnh nhập, biến và bao gồm. Thao tác nhập giúp các lớp dễ tham chiếu bên trong tệp bố cục của bạn. Biến cho phép bạn mô tả một thuộc tính có thể dùng trong biểu thức liên kết. Cho phép bạn sử dụng lại các bố cục phức tạp trên ứng dụng của mình.
Nhập
Các lệnh nhập cho phép bạn tham chiếu các lớp bên trong tệp bố cục, chẳng hạn như trong mã được quản lý.
Bạn có thể dùng không hoặc nhiều phần tử import
trong phần tử data
. Ví dụ về mã sau đây nhập lớp View
vào tệp bố cục:
<data>
<import type="android.view.View"/>
</data>
Việc nhập lớp View
cho phép bạn tham chiếu lớp này từ biểu thức liên kết.
Ví dụ sau đây cho biết cách tham chiếu đến các hằng số VISIBLE
và GONE
của lớp View
:
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
Nhập bí danh
Khi có xung đột tên lớp, bạn có thể đổi tên một trong các lớp thành bí danh. Ví dụ sau đây đổi tên lớp View
trong gói com.example.real.estate
thành Vista
:
<import type="android.view.View"/>
<import type="com.example.real.estate.View"
alias="Vista"/>
Sau đó, bạn có thể sử dụng Vista
để tham chiếu com.example.real.estate.View
và View
để tham chiếu android.view.View
trong tệp bố cục.
Nhập các lớp học khác
Bạn có thể sử dụng các loại đã nhập làm tham chiếu loại trong các biến và biểu thức. Ví dụ sau đây cho thấy User
và List
được dùng làm loại biến:
<data>
<import type="com.example.User"/>
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
Bạn có thể sử dụng các loại đã nhập để truyền một phần của biểu thức. Ví dụ sau đây truyền thuộc tính connection
thành một loại User
:
<TextView
android:text="@{((User)(user.connection)).lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Bạn cũng có thể sử dụng các loại đã nhập khi tham chiếu các trường và phương thức tĩnh trong biểu thức. Mã sau đây nhập lớp MyStringUtils
và tham chiếu đến phương thức capitalize
của lớp đó:
<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"/>
Cũng giống như trong mã được quản lý, java.lang.*
được nhập tự động.
Biến
Bạn có thể dùng nhiều phần tử variable
bên trong phần tử data
. Mỗi phần tử variable
mô tả một thuộc tính có thể đặt trên bố cục để dùng trong các biểu thức liên kết trong tệp bố cục. Ví dụ sau đây khai báo các biến user
, image
và note
:
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
Các loại biến được kiểm tra tại thời điểm biên dịch, vì vậy, nếu một biến triển khai Observable
hoặc là một bộ sưu tập có thể quan sát, thì dữ liệu đó phải được phản ánh trong kiểu dữ liệu đó. Nếu biến là lớp cơ sở hoặc giao diện không triển khai giao diện Observable
, thì các biến sẽ không được quan sát.
Khi có nhiều tệp bố cục cho nhiều cấu hình (ví dụ: ngang hoặc dọc), các biến sẽ được kết hợp. Không được xảy ra xung đột các định nghĩa biến giữa các tệp bố cục này.
Lớp liên kết được tạo có một phương thức setter và getter cho mỗi biến được mô tả. Các biến này sẽ lấy giá trị mã được quản lý mặc định cho đến khi phương thức setter được gọi – null
cho các loại tham chiếu, 0
cho int
, false
cho boolean
, v.v.
Một biến đặc biệt có tên là context
sẽ được tạo để sử dụng trong biểu thức liên kết khi cần. Giá trị của context
là đối tượng Context
trong phương thức getContext()
của khung hiển thị gốc. Biến context
sẽ bị ghi đè bởi một nội dung khai báo biến rõ ràng có tên đó.
Bao gồm
Bạn có thể chuyển các biến vào liên kết của bố cục đi kèm từ bố cục chứa
bằng cách sử dụng không gian tên ứng dụng và tên biến trong một thuộc tính. Ví dụ sau đây cho thấy các biến user
có trong tệp bố cục name.xml
và contact.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>
Tính năng liên kết dữ liệu không hỗ trợ thao tác bao gồm dưới dạng phần tử con trực tiếp của phần tử hợp nhất. Ví dụ: bố cục sau đây không được hỗ trợ:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<merge><!-- Doesn't work -->
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</merge>
</layout>
Tài nguyên khác
Để tìm hiểu thêm về liên kết dữ liệu, hãy tham khảo thêm các tài nguyên sau đây.