Ngôn ngữ biểu thức cho phép bạn viết biểu thức xử lý các sự kiện được gửi đi theo lượt xem. Thư viện liên kết dữ liệu tự động tạo các lớp bắt buộc để liên kết thành phần hiển thị trong bố cục với đối tượng dữ liệu.
Các tệp bố cục liên kết dữ liệu hơi khác và bắt đầu bằng thẻ gốc là
layout
, theo sau là phần tử data
và phần tử gốc view
. Chế độ xem này
là phần tử gốc của bạn trong tệp bố cục không liên kết. Mã sau đây
hiển thị 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" />
Biểu thức trong bố cục được viết trong các thuộc tính bằng cách sử dụng
Cú pháp @{}
. Trong ví dụ sau, phương thức
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, những 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 các quy ước, chẳng hạn như sử dụng phương thức truy cập trong ngôn ngữ lập trình Java, như được thể hiện 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; } }
Về khía cạnh liên kết dữ liệu, hai lớp này là tương đương. Chiến lược phát hành đĩa đơn
biểu thức @{user.firstName}
được dùng cho phương thức
android:text
truy cập vào trường firstName
trong lớp cũ và
getFirstName()
trong lớp sau. Thông tin này cũng được phân giải thành
firstName()
, nếu phương thức đó tồn tại.
Liên kết dữ liệu
Một lớp liên kết sẽ được tạo cho từng tệp bố cục. Theo mặc định, tên của
lớp dựa trên tên của tệp bố cục, được chuyển đổi theo kiểu viết hoa Pascal, với
hậu tố Binding được thêm vào. 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 chứa tất cả các liên kết từ các thuộc tính bố cục – ví dụ:
biến user
— cho thành phần hiển thị của bố cục và biết cách chỉ định giá trị
cho các biểu thức ràng buộc. 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ể
bằng cách sử dụng
LayoutInflater
, như minh hoạ trong
ví dụ sau:
Kotlin
val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())
Java
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
Nếu bạn đang sử dụng các mục liên kết dữ liệu bên trong một
Fragment
!
ListView
hoặc
RecyclerView
bộ chuyển đổi, bạn có thể muốn sử dụng
inflate()
của các lớp liên kết hoặc
DataBindingUtil
, vì
như trong đoạn mã ví dụ 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 trông rất giống 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 bằng ngôn ngữ biểu thức:
- Toán học:
+ - / * %
- Cách nối chuỗi:
+
- Logic:
&& ||
- Tệp nhị phân:
& | ^
- Một ngôi:
+ - ! ~
- Shift:
>> >>> <<
- Phép so sánh:
== > < >= <=
(<
cần được thoát dưới dạng<
) instanceof
- Phân nhóm:
()
- Các ký tự, 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
- Quyền truy cập vào 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ử
Bạn có thể sử dụng các toán tử sau trong cú pháp biểu thức trong mã được quản lý:
this
super
new
- Lời gọi chung rõ ràng
Toán tử hợp nhất rỗng
Toán tử liên kết rỗng (??
) chọn toán hạng bên trái nếu toán tử đó không phải là null
hoặc bên phải nếu cái trước là null
:
android:text="@{user.displayName ?? user.lastName}"
Chức năng này tương đương với:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Thông tin tham khảo về thuộc tính
Biểu thức có thể tham chiếu đến thuộc tính trong lớp bằng cách sử dụng định dạng sau,
tương tự với các trường, phương thức getter và
ObservableField
đối tượng:
android:text="@{user.lastName}"
Tránh ngoại lệ về con trỏ rỗng
Mã liên kết dữ liệu đã tạo sẽ tự động kiểm tra các giá trị null
và tránh
ngoại lệ về con trỏ rỗng. Ví dụ: trong biểu thức @{user.name}
, nếu
user
rỗng, user.name
được gán giá trị mặc định 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ử 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 thành phần hiển thị khác trong bố cục theo mã nhận dạng, bằng cách sử dụng các hàm sau cú pháp:
android:text="@{exampleText.text}"
Trong ví dụ sau, thành phần hiển thị TextView
tham chiếu đến một thành phần hiển thị EditText
trong
có cùng 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 vào các tập hợp phổ biến, chẳng hạn như mảng, danh sách, danh sách thưa thớt và
bản đồ, 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 tệp ánh xạ bằng ký hiệu object.key
. Cho
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ư 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 làm như vậy,
giá trị cố định kiểu chuỗi phải được bao quanh bằng dấu phẩy ngược `
, như minh hoạ
tại đây:
android:text="@{map[`firstName`]}"
Tài nguyên
Một biểu thức có thể tham chiếu các tài nguyên ứng dụng bằng 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à chế độ xem tham chiếu 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ư minh hoạ sau đây bảng:
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 đi
các chế độ xem, ví dụ:
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
khác android:onClick
để tránh xung đột. Bạn có thể sử dụng
sau đây để tránh các loại xung đột này:
Lớp | Phương thức setter 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 hai 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ể
tuân theo chữ ký của phương thức trình nghe. Thời gian
một biểu thức đánh giá là một tham chiếu phương thức, liên kết dữ liệu sẽ gói phương thức
tham chiếu và đối tượng chủ sở hữu trong trình nghe cũng như thiết lập trình nghe đó trên
chế độ xem mục tiêu. Nếu biểu thức có giá trị là
null
, thì liên kết dữ liệu sẽ không hãy tạo một trình nghe rồi thiết lập một trình nghenull
. - Liên kết trình nghe: đây là những biểu thức lambda sẽ được đánh giá khi sự kiện đó xảy ra. Liên kết dữ liệu luôn tạo ra một trình nghe được đặt trên khung hiển thị. Khi sự kiện được gửi đi, trình nghe đánh giá biểu thức lambda.
Tài liệu tham khảo cho phương thức
Bạn có thể trực tiếp liên kết các sự kiện với phương thức trình xử lý, tương tự như cách bạn có thể
gán
android:onClick
thành một
trong một hoạt động. Một lợi thế so với
Thuộc tính View
onClick
là
được xử lý tại thời điểm biên dịch. Vì vậy, nếu phương thức không tồn tại hoặc
chữ ký 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 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 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 hãy sử dụng 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 với là tên phương thức cần gọi. Ví dụ: hãy xem ví dụ sau đây đối tượng dữ liệu bố cục:
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
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:onClick="@{handlers::onClickFriend}"/>
</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. Chúng tương tự như tham chiếu phương thức, nhưng chúng cho phép bạn chạy liên kết dữ liệu tuỳ ý biểu thức. Tính năng này hoạt động trong Trình bổ trợ Android cho Gradle dành cho Gradle phiên bản 2.0 trở lên.
Trong các 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ề của bạn phải khớp với
giá trị trả về dự kiến của trình nghe, trừ phi đang mong đợi void
. Cho
ví dụ: hãy xem xét lớp người trình bày sau đây có onSaveClick()
phương thức:
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:onClick="@{() -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>
Khi lệnh gọi lại được sử dụng trong một biểu thức, 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 chế độ xem kích hoạt sự kiện, liên kết dữ liệu sẽ đánh giá biểu thức đã cho. Giống như liên kết thông thường biểu thức, bạn sẽ nhận được giá trị rỗng và an toàn cho luồng của liên kết dữ liệu trong khi biểu thức trình nghe đ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 hai lựa chọn cho tham số trình nghe:
bạn có thể bỏ qua mọi tham số cho phương thức hoặc đặt tên cho tất cả các tham số đó. Nếu bạn muốn
để đặt tên cho các tham số, bạn có thể sử dụng chúng trong biểu thức của mình. Ví dụ: bạn
có thể viết biểu thức trước như sau:
android:onClick="@{(view) -> presenter.onSaveClick(task)}"
Nếu muốn sử dụng tham số trong biểu thức, bạn có thể thực hiện như sau:
Kotlin
class Presenter { fun onSaveClick(view: View, task: Task){} }
Java
public class Presenter { public void onSaveClick(View view, Task task){} }
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"
Và bạn 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:onCheckedChanged="@{(cb, 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
,
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
để lắng nghe cử chỉ chạm & 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:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
Nếu biểu thức không được đánh giá do các đối tượng null
, thì 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 bạn cần sử dụng một biểu thức có vị từ (ví dụ:
3 ngôi – bạn có thể dùng void
làm ký hiệu:
android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
Tránh dùng trình nghe phức tạp
Biểu thức trình nghe rất hiệu quả và có thể giúp mã của bạn dễ đọc hơn. Trên Mặt khác, trình nghe chứa các biểu thức phức tạp sẽ làm cho bố cục của bạn khó hơn để đọc và duy trì. Giữ biểu thức đơn giản như truyền dữ liệu có sẵn từ giao diện người dùng sang phương thức gọi lại. Triển khai mọi logic nghiệp vụ bên trong mà bạn gọi từ biểu thức trình nghe.
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ư 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. Bao gồm 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
Thao tác 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ể sử dụng không hoặc nhiều phần tử import
bên trong phần tử data
. Chiến lược phát hành đĩa đơn
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>
Khi nhập lớp View
, bạn có thể tham chiếu lớp này từ biểu thức liên kết.
Ví dụ sau đây trình bày cách tham chiếu đến
VISIBLE
và
Hằng số 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}"/>
Loại bí danh
Khi có xung đột về 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
gửi đến 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 khác
Bạn có thể sử dụng các loại đã nhập làm tham chiếu loại trong biến và biểu thức. Chiến lược phát hành đĩa đơn
ví dụ sau đây cho thấy User
và List
dùng làm loại của 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 kiểu đã nhập để truyền một phần của biểu thức. Nội dung sau đây
Ví dụ sẽ 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 kiểu đã nhập khi tham chiếu các trường và phương thức tĩnh trong
biểu thức. Đoạn mã sau đây nhập lớp MyStringUtils
và các tham chiếu
phương thức capitalize
của nó:
<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"/>
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ột
Phần tử variable
mô tả một thuộc tính có thể được đặt trên bố cục để dùng
trong 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 sẽ đượ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à
bộ sưu tập có thể ghi nhận,
phải được phản ánh trong loại. Nếu biến là lớp cơ sở hoặc giao diện
không triển khai giao diện Observable
, các biến không
quan sát thấy.
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 có định nghĩa biến xung đột 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 phương thức đã mô tả
biến. Các biến sẽ lấy các giá trị mã được quản lý mặc định cho đến phương thức setter
được gọi – null
cho 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
đượ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
từ chế độ xem gốc
getContext()
. Chiến lược phát hành đĩa đơn
Biến context
bị ghi đè bởi một khai báo biến rõ ràng bằng cách này
.
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ừ hàm 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. Chiến lược phát hành đĩa đơn
ví dụ sau đây cho thấy các biến user
được đưa vào từ name.xml
và
Tệp bố cục 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>
Liên kết dữ liệu không hỗ trợ 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.