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

Phần tử của thư viện AndroidX Toolbar cung cấp các cách khác nhau để người dùng tương tác với ứng dụng của bạn. Phần Thêm và xử lý các thao tác mô tả cách xác định một hành động, 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:

  • Lượt xem thao tác là một thao tác cung cấp chức năng phong phú trong thanh ứng dụng. Cho Ví dụ: chế độ xem hành động 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 phải để thay đổi hoạt động hoặc mảnh.
  • Trình cung cấp thao tác 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 nút hoặc mục trong trình đơn; khi người dùng nhấn vào thao tác đó, trình cung cấp thao tác sẽ kiểm soát hành vi của thao tác theo bất cứ 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 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 chế độ xem hành động để nhập cụm từ tìm kiếm. Chiến lược phát hành đĩa đơn ShareActionProvider tiện ích triển khai 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ị hành động và trình cung cấp hành động của riêng bạn.

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

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

  • actionViewClass: lớp tiện ích giúp 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ày 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 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 đã chỉ định của android:icon. Nếu không có khoảng trống trong thanh ứng dụng, ứng dụng sẽ thêm hành động vào trình đơn mục bổ sung.

Hình ảnh thể hiện 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 mà người dùng tương tác với nó.

Hình ảnh minh hoạ chế độ xem tìm kiếm mở ra sau khi thanh tìm kiếm được lấy làm 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 làm tâm điểm.

Nếu bạn cần định cấu hình thao tác này, hãy thực hiện trong onCreateOptionsMenu() . Bạn có thể lấy 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 SearchView tiện ích được xác định trong ví dụ 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 phần mở rộng chế độ xem hành động

Nếu phần tử <item> của thao tác có cờ collapseActionView, ứng dụng 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 sẵn dành cho onOptionsItemSelected() mở rộng chế độ xem hành động. Nếu lớp con hoạt động của bạn ghi đè 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 thao tác khi thao tác đó được mở rộng hoặc thu gọn, bạn có thể xác định một lớp implements MenuItem.OnActionExpandListener, và chuyển một thành viên của lớp đó đến setOnActionExpandListener() Ví dụ: bạn có thể cần cập nhật hoạt động dựa trên việc chế độ xem 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 trình đơn của thanh công cụ như mô tả trong Thêm và xử lý các thao tác. Thêm một actionProviderClass và đặt thuộc tính này thành tên lớp đủ điều kiện cho giá trị lớp trình cung cấp thao tác.

Ví dụ: Mã sau đây khai báo ShareActionProvider, 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 đang dùng một thao tác tuỳ chỉnh, khai báo biểu tượng.

Tài nguyên khác

  • Xem ShareActionProvider chẳng hạn như thêm thao tác chia sẻ vào thanh ứng dụng trên cùng.
  • Xem ActionProvider cho thông tin khác về cách tạo trình cung cấp hành động tuỳ chỉnh.