Bố cục và biểu thức liên kết

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 &lt;)
  • 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&lt;String>"/>
    <variable name="sparse" type="SparseArray&lt;String>"/>
    <variable name="map" type="Map&lt;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ínhchế độ 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 nghe null.
  • 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.ViewView để 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 UserList 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&lt;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, imagenote:

<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.

Mẫu

Lớp học lập trình

Bài đăng trên blog