Thêm thao tác vào một thông báo

Thử cách 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ông báo trong Compose.

Bạn có thể thêm một thao tác vào Snackbar để cho phép người dùng phản hồi tin nhắn của bạn. Khi bạn làm như vậy, Snackbar sẽ đặt một nút bên cạnh văn bản tin nhắn và người dùng có thể kích hoạt hành động của bạn bằng cách nhấn vào nút. Ví dụ: một ứng dụng email có thể đặt nút huỷ trên thông báo "email đã được lưu trữ". Nếu người dùng nhấn vào nút huỷ, ứng dụng sẽ chuyển email ra khỏi kho lưu trữ.

Hình ảnh minh hoạ một thanh thông báo nhanh có nút hành động HUỶ
Hình 1. Một Snackbar có nút hành động hoàn tác giúp khôi phục một mục đã xoá.

Để thêm một thao tác vào thông báo Snackbar, hãy xác định một đối tượng trình nghe triển khai giao diện View.OnClickListener. Hệ thống sẽ gọi phương thức onClick() của trình nghe nếu người dùng nhấn vào hành động cho tin nhắn. Ví dụ: đoạn mã này cho thấy một trình nghe cho thao tác huỷ:

Kotlin

class MyUndoListener : View.OnClickListener {

  fun onClick(v: View) {
    // Code to undo the user's last action.
  }
}

Java

public class MyUndoListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {

        // Code to undo the user's last action.
    }
}

Sử dụng một trong các phương thức setAction() để đính kèm trình nghe vào Snackbar. Đính kèm trình nghe trước khi bạn gọi show(), như minh hoạ trong đoạn mã mẫu này:

Kotlin

val mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
                               R.string.email_archived, Snackbar.LENGTH_SHORT)
mySnackbar.setAction(R.string.undo_string, MyUndoListener())
mySnackbar.show()

Java

Snackbar mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
        R.string.email_archived, Snackbar.LENGTH_SHORT);
mySnackbar.setAction(R.string.undo_string, new MyUndoListener());
mySnackbar.show();
Nếu đang dùng Jetpack Compose, bạn có thể hiện SnackbarHost, như trong ví dụ sau:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {

      super.onCreate(savedInstanceState)

      setContent {
          DACPlaygroundTheme {
              val snackbarHostState = remember { SnackbarHostState() }
              val scope = rememberCoroutineScope()
              Scaffold(
                  snackbarHost = { SnackbarHost(snackbarHostState) },
                  content = { padding ->
                      Button(
                          modifier = Modifier.padding(padding),
                          onClick = {
                              scope.launch {
                                  snackbarHostState.showSnackbar(
                                      message = "1 item removed",
                                      actionLabel = "UNDO",
                                      duration = SnackbarDuration.Short
                                  ).run {
                                      when (this) {
                                          Dismissed -> Log.d("SNACKBAR", "Dismissed")
                                          ActionPerformed -> Log.d("SNACKBAR", "UNDO CLICKED")
                                      }
                                  }
                              }
                          }
                      ) { Text("Show snackbar") }
                  }
              )
          }
      }
  }