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 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 &lt;)
  • 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&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 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ínhtham 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 nghe null.
  • 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: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. 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:onClick="@{() -> 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:onClick="@{(view) -> 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:onClick="@{(theView) -> 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: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, 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:onLongClick="@{(theView) -> 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:onClick="@{(v) -> 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ố VISIBLEGONE 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.ViewView để 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 UserList đượ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&lt;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, 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 đượ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.xmlcontact.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.

Mẫu

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

Bài đăng trên blog