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

Thử cách 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 các 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ý các 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 2 thành phần linh hoạt:

  • Chế độ xem thao tác là một thao tác cung cấp nhiều chức năng trong thanh ứng dụng. Ví dụ: khung 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.
  • Nhà cung cấp thao tác là một thao tác có bố cục tuỳ chỉnh riêng. Hành động này ban đầu 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 này, trì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ị một trình đơn.

AndroidX cung cấp một số tiện ích chế độ xem thao tác và trình cung cấp thao tác chuyên biệt. Ví dụ: tiện ích SearchView triển khai một khung hiển thị hành động để nhập cụm từ tìm kiếm. Tiện ích ShareActionProvider triển khai một trình cung cấp thao tác để 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 khung hiển thị thao tác

Để thêm một khung 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ý các 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 thao tác
  • actionLayout: một 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 này dưới dạng một mục trong trình đơn. Khi người dùng tương tác với khung hiển thị thao tác, khung này sẽ mở rộng để lấp đầy thanh ứng dụng.

Ví dụ: đoạn mã sau đây thêm một 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, ứ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 cho thấy 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ó 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 trong 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 sẽ mở ra 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 khi thanh tìm kiếm được lấy tiêu điểm.

Nếu bạn cần định cấu hình thao tác, hãy thực hiện 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 khung hiển thị thao tác bằng cách gọi phương thức getActionView(). Ví dụ: mã sau đây 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 khung hiển thị thao tác

Nếu phần tử <item> của thao tác có cờ collapseActionView, ứng dụng sẽ hiển thị khung 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 khung 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 cho onOptionsItemSelected() sẽ mở rộng khung hiển thị thao tác. Nếu lớp con hoạt động của bạn ghi đè phương thức onOptionsItemSelected(), thì phương thức ghi đè của bạn phải gọi super.onOptionsItemSelected() để siêu lớp có thể mở rộng khung hiển thị thao tác.

Nếu muốn làm việc 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 phầ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 một 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 một trình cung cấp thao tác

Để khai báo một trình cung cấp 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ý các thao tác. Thêm một thuộc tính actionProviderClass và đặt thuộc tính đó thành tên lớp đủ điều kiện cho lớp trình cung cấp thao tác.

Ví dụ: mã sau đây khai báo một 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 thao tác 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 thao tác tuỳ chỉnh.