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

Toolbar của thư viện AndroidX cung cấp cho người dùng nhiều cách để tương tác với ứng dụng. 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 hành động là một hành động cung cấp chức năng phong phú 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 phải thay đổi các 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. Hành động ban đầu xuất hiện dưới dạng một nút hoặc một mục trong trình đơn; khi người dùng nhấn vào hành động đó, 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 mà bạn xác định. Ví dụ: trình cung cấp hành động có thể phản hồi một lượt nhấn bằng cách hiển thị một trình đơn.

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

Thêm chế độ xem hành động

Để thêm 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ý 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 tiện ích giúp triển khai hành động
  • 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 dưới dạng một mục trong trình đơn. Khi người dùng tương tác với chế độ xem hành động, chế độ xem này sẽ mở rộng để lấp đầy thanh ứng dụng.

Ví dụ: Mã sau đây 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, ứ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ó không gian trong thanh ứng dụng, ứng dụng sẽ thêm thao tác này vào trình đơn mục bổ sung.

Hình ảnh một thanh tìm kiếm với cá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 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 một chế độ xem tìm kiếm sẽ mở ra sau khi thanh tìm kiếm được đặt 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 thao tác đó, 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 thông tin tham chiếu đối tượng của khung hiển thị hành động 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ên:

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 với tính năng mở rộng chế độ xem hành động

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

Nếu muốn thực hiện một thao tác nào đó khi thao tá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à chuyể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 khung hiển thị hành động đượ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 trình cung cấp hành động

Để khai báo 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ý thao tác. Thêm 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 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 dùng một thao tác tuỳ chỉnh, hãy khai báo 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 một trình cung cấp thao tác tuỳ chỉnh.