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

Thử cách dùng 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 thành phần trong Compose.

Thanh ứng dụng cho phép bạn thêm các nút cho hành động 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 cho ngữ cảnh hiện tại ở đầu ứng dụng. Ví dụ: ứng dụng duyệt xem ảnh có thể hiển thị các nút chia sẻtạo album ở đầu khi người dùng đang xem cuộn ảnh của họ. Khi người dùng xem một bức ảnh riêng lẻ, ứng dụng có thể hiển thị các nút cắtbộ lọc.

Không gian trong 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ố lượng có thể 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 bổ sung. Ứng dụng cũng có thể chỉ định một thao tác luôn xuất hiện 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ó 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 thao tác đều được xác định trong tài nguyên trình đơn XML. Để thêm 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 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:

<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 thao tác có hiển thị dưới dạng nút trên thanh ứng dụng hay không. Nếu bạn đặt app:showAsAction="ifRoom" – như trong thao tác yêu thích của mã ví dụ – thao tác này sẽ hiển thị dưới dạng nút nếu có chỗ trong thanh ứng dụng. Nếu không có đủ không gian, các thao tác thừa sẽ được gửi đến trình đơn mục bổ sung. Nếu bạn đặt app:showAsAction="never" – như trong thao tác cài đặt của mã ví dụ – thì thao tác này sẽ luôn được liệt kê trong trình đơn mục bổ sung và không xuất hiện trong thanh ứng dụng.

Hệ thống 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 phương thức gọi lại onOptionsItemSelected() của hoạt động và truyền đối tượng MenuItem để cho biết người dùng đã nhấn vào mục nào. 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 được 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 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 phương thức lớp cha:

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

    }
}