Sử dụng khung hiển thị thao tác và trình cung cấp thao tác

Thử cách dùng Compose
Jetpack Compose là bộ công cụ giao diện người dùng được đề xuất cho Android. Tìm hiểu cách thêm thành phần trong Compose.

Toolbar của thư viện AndroidX cung cấp nhiều cách để người dùng tương tác với ứng dụng của bạn. Thêm và xử lý thao tác mô tả cách xác định một thao tác, có thể là một nút hoặc một mục trong trình đơn. Tài liệu này mô tả cách thêm hai thành phần linh hoạt:

  • Chế độ xem thao tác là một thao tác cung cấp chức năng phong phú trong thanh ứng dụng. Ví dụ: thành phần hiển thị thao tác tìm kiếm cho phép người dùng nhập văn bản tìm kiếm vào thanh ứng dụng mà không cần thay đổi hoạt động hoặc mảnh.
  • Trình cung cấp hành động là một hành động có bố cục tuỳ chỉnh riêng. Ban đầu, hành động sẽ xuất hiện dưới dạng một nút hoặc mục trong trình đơn; khi người dùng nhấn vào hành động, nhà cung cấp hành động sẽ kiểm soát hành vi của hành động theo bất kỳ cách nào bạn xác định. Ví dụ: trình cung cấp thao tác có thể phản hồi một thao tác nhấn bằng cách hiển thị trình đơn.

AndroidX cung cấp một số tiện ích chuyên biệt về chế độ xem hành động và trình cung cấp hành động. Ví dụ: tiện ích SearchView triển khai khung hiển thị thao tác để nhập cụm từ tìm kiếm. Tiện ích ShareActionProvider triển khai một trình cung cấp hành động để chia sẻ thông tin với các ứng dụng khác. Bạn cũng có thể xác định khung hiển thị thao tác và trình cung cấp thao tác của riêng mình.

Thêm thành phần hiển thị thao tác

Để thêm thành phần hiển thị thao tác, hãy tạo một phần tử <item> trong tài nguyên trình đơn của thanh công cụ, như mô tả trong phần Thêm và xử lý thao tác. Thêm một trong các thuộc tính sau vào phần tử <item>:

  • actionViewClass: lớp của một tiện ích triển khai hành động
  • actionLayout: tài nguyên bố cục mô tả các thành phần của thao tác

Đặt thuộc tính showAsAction thành "ifRoom|collapseActionView" hoặc "never|collapseActionView". Cờ collapseActionView cho biết cách hiển thị tiện ích khi người dùng không tương tác với tiện ích đó. Nếu tiện ích nằm trên thanh ứng dụng, ứng dụng sẽ hiển thị tiện ích dưới dạng biểu tượng. Nếu tiện ích nằm trong trình đơn mục bổ sung, ứng dụng sẽ hiển thị tiện ích dưới dạng một mục trong trình đơn. Khi người dùng tương tác với thành phần hiển thị thao tác, thành phần này sẽ mở rộng để lấp đầy thanh ứng dụng.

Ví dụ: mã sau đây sẽ thêm tiện ích SearchView vào thanh ứng dụng:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

Nếu người dùng không tương tác với tiện ích, thì ứng dụng sẽ hiển thị tiện ích dưới dạng biểu tượng do android:icon chỉ định. Nếu không có chỗ trong thanh ứng dụng, ứng dụng sẽ thêm thao tác vào trình đơn mục bổ sung.

Hình ảnh hiển thị một thanh tìm kiếm có biểu tượng ở đầu và cuối.
Hình 1. Thanh tìm kiếm có các biểu tượng ở đầu và cuối.

Khi người dùng nhấn vào biểu tượng hoặc mục trình đơn, tiện ích sẽ mở rộng để lấp đầy thanh công cụ, cho phép người dùng tương tác với tiện ích đó.

Hình ảnh cho thấy chế độ xem tìm kiếm mở ra sau khi thanh tìm kiếm được lấy tiêu điểm.
Hình 2. Chế độ xem tìm kiếm sẽ mở ra sau khi thanh tìm kiếm được lấy tiêu điểm.

Nếu bạn cần định cấu hình hành động, hãy thực hiện việc này trong lệnh gọi lại onCreateOptionsMenu() của hoạt động. Bạn có thể lấy tham chiếu đối tượng của thành phần hiển thị thao tác bằng cách gọi phương thức getActionView(). Ví dụ: mã sau đây sẽ lấy tham chiếu đối tượng cho tiện ích SearchView được xác định trong ví dụ về mã trước:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

Phản hồi việc mở rộng chế độ xem hành động

Nếu phần tử <item> của thao tác có cờ collapseActionView, thì ứng dụng sẽ hiển thị thành phần hiển thị thao tác dưới dạng biểu tượng cho đến khi người dùng tương tác với thành phần hiển thị thao tác đó. Khi người dùng nhấn vào biểu tượng, trình xử lý tích hợp sẵn cho onOptionsItemSelected() sẽ mở rộng thành phần hiển thị thao tác. Nếu lớp con của hoạt động ghi đè phương thức onOptionsItemSelected(), thì phương thức ghi đè phải gọi super.onOptionsItemSelected() để lớp cha có thể mở rộng thành phần hiển thị thao tác.

Nếu muốn làm gì đó khi thao tác được mở rộng hoặc thu gọn, bạn có thể xác định một lớp triển khai MenuItem.OnActionExpandListener và truyền một thành viên của lớp đó đến setOnActionExpandListener(). Ví dụ: bạn có thể muốn cập nhật hoạt động dựa trên việc chế độ xem thao tác được mở rộng hay thu gọn. Đoạn mã sau đây cho biết cách xác định và truyền trình nghe:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

Thêm trình cung cấp hành động

Để khai báo trình cung cấp thao tác, hãy tạo phần tử <item> trong tài nguyên trình đơn của thanh công cụ, như mô tả trong phần Thêm và xử lý thao tác. Thêm thuộc tính actionProviderClass rồi đặt thuộc tính đó thành tên lớp đủ điều kiện cho lớp trình cung cấp hành động.

Ví dụ: mã sau đây khai báo ShareActionProvider, đây là một tiện ích được xác định trong thư viện AndroidX cho phép ứng dụng của bạn chia sẻ dữ liệu với các ứng dụng khác:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

Trong trường hợp này, bạn không cần khai báo biểu tượng cho tiện ích vì ShareActionProvider cung cấp đồ hoạ riêng. Nếu bạn đang sử dụng một hành động tuỳ chỉnh, hãy khai báo một biểu tượng.

Tài nguyên khác

  • Hãy xem ShareActionProvider để biết ví dụ về cách thêm thao tác chia sẻ vào thanh ứng dụng trên cùng.
  • Hãy xem ActionProvider để biết thêm thông tin về cách tạo trình cung cấp hành động tuỳ chỉnh.