Thêm và xử lý các thao tác

Thanh ứng dụng cho phép bạn thêm các nút cho thao tác của người dùng. Tính năng này cho phép bạn đặt các thao tác quan trọng nhất đối với ngữ cảnh hiện tại ở đầu ứng dụng. Ví dụ: ứng dụng duyệt ảnh có thể hiển thị chia sẻtạo ở trên cùng khi người dùng nhìn vào thư viện ảnh của họ. Thời gian người dùng xem từng ảnh, ứng dụng có thể hiển thị thao tác cắtbộ lọc.

Không gian trong thanh ứng dụng bị hạn chế. Nếu một ứng dụng khai báo nhiều thao tác hơn mức có thể trong thanh ứng dụng, thanh ứng dụng sẽ gửi các thao tác thừa đến một trình đơn mục bổ sung. Ứng dụng cũng có thể chỉ định rằng một hành động luôn hiển thị trong trình đơn mục bổ sung, thay vì hiển thị trên thanh ứng dụng.

Hình ảnh thể hiện ứng dụng Now in Android với biểu tượng thanh thao tác
Hình 1. Biểu tượng hành động trong ứng dụng "Now in Android" .

Thêm nút hành động

Tất cả các nút hành động và các mục khác có trong mục bổ sung hành động được xác định trong XML tài nguyên trình đơn. Để thêm thao tác vào thanh tác vụ, tạo một tệp XML mới trong tệp Thư mục res/menu/.

Thêm một <item> cho mỗi mục bạn muốn đưa vào thanh tác vụ, như được minh hoạ trong tệp XML trình đơn mẫu sau đây:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Mark Favorite", must appear as action button if possible. -->
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <!-- Settings, must always be in the overflow. -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>

</menu>

Thuộc tính app:showAsAction chỉ định liệu hành động có được hiển thị dưới dạng một nút trên thanh ứng dụng. Nếu bạn đặt app:showAsAction="ifRoom"—như trong mã ví dụ thao tác yêu thích – thao tác hiển thị dưới dạng một nút nếu có chỗ trong thanh ứng dụng cho nội dung đó. Nếu không có đủ chỗ, những hành động vượt quá sẽ được gửi đến trình đơn mục bổ sung. Nếu bạn đặt app:showAsAction="never" như trong hành động cài đặt của mã ví dụ—hành động luôn được liệt kê trong trình đơn mục bổ sung và không được hiển thị trong thanh ứng dụng.

Hệ thống sẽ sử dụng biểu tượng của hành động làm nút hành động nếu hành động đó hiển thị trong thanh ứng dụng. Bạn có thể tìm thấy nhiều biểu tượng hữu ích trong Biểu tượng Material.

Phản hồi hành động

Khi người dùng chọn một trong các mục trên thanh ứng dụng, hệ thống sẽ gọi của hoạt động onOptionsItemSelected() và truyền một Đối tượng MenuItem để cho biết mục nào đã được nhấn. Trong quá trình triển khai onOptionsItemSelected(), hãy gọi phương thức MenuItem.getItemId() để xác định mục nào đã được nhấn. Mã nhận dạng được trả về khớp với giá trị mà bạn hãy khai báo trong phần tử <item> tương ứng Thuộc tính android:id.

Ví dụ: đoạn mã sau đây sẽ kiểm tra hành động mà người dùng chọn. Nếu không nhận ra hành động của người dùng, phương thức này sẽ gọi lớp cấp cao phương thức:

Kotlin

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.action_settings -> {
        // User chooses the "Settings" item. Show the app settings UI.
        true
    }

    R.id.action_favorite -> {
        // User chooses the "Favorite" action. Mark the current item as a
        // favorite.
        true
    }

    else -> {
        // The user's action isn't recognized.
        // Invoke the superclass to handle it.
        super.onOptionsItemSelected(item)
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chooses the "Settings" item. Show the app settings UI.
            return true;

        case R.id.action_favorite:
            // User chooses the "Favorite" action. Mark the current item as a
            // favorite.
            return true;

        default:
            // The user's action isn't recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}