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 để thực hiện thao tác của người dùng. Tính năng này cho phép bạn đặt các hành động 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ị các nút chia sẻtạo album ở trên cùng khi người dùng xem thư viện ảnh của họ. Khi người dùng xem một ảnh riêng lẻ, ứng dụng có thể hiển thị các nút cắtbộ lọc.

Không gian trên thanh ứng dụng bị giới hạn. Nếu một ứng dụng khai báo nhiều thao tác hơn số thao tác vừa với thanh ứng dụng, thì thanh ứng dụng sẽ gửi các thao tác thừa đến trình đơn mục bổ sung. Ứng dụng cũng có thể chỉ định rằng một thao tác 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 cho thấy ứng dụng Now in Android cùng với biểu tượng thanh thao tác
Hình 1. Một biểu tượng hành động trong ứng dụng "Now in Android".

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

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

Thêm một phần tử <item> cho từng mục bạn muốn đưa vào thanh thao tác, như 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ó hiển thị dưới dạng một nút trên thanh ứng dụng hay không. Nếu bạn đặt app:showAsAction="ifRoom" (như trong hành động yêu thích của mã trong ví dụ) thì thao tác sẽ hiển thị dưới dạng nút nếu có chỗ trong thanh ứng dụng. Nếu không có đủ dung lượng, các thao tác thừa sẽ được gửi tới trình đơn mục bổ sung. Nếu bạn đặt app:showAsAction="never" (như trong thao tác settings) của mã ví dụ, thì thao tác sẽ luôn được liệt kê trong trình đơn mục bổ sung và không hiển thị trong thanh ứng dụng.

Hệ thống sẽ sử dụng biểu tượng của thao tác làm nút hành động nếu thao tác đó 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 các thao tác

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 phương thức gọi lại onOptionsItemSelected() của hoạt động 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ị bạn khai báo trong thuộc tính android:id của phần tử <item> tương ứng.

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

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);

    }
}