为消息添加操作

试用 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中添加通知。

您可以向 Snackbar 添加操作,以便用户回复您的消息。当您执行此操作时,Snackbar 会在消息文本旁边放置一个按钮,这样用户就可以通过点按该按钮来触发您的操作。例如,电子邮件应用可能会在其“电子邮件已归档”消息上放置一个“撤消”按钮。如果用户点按撤消按钮,应用会将电子邮件从归档中撤回。

图片中显示了带有“撤消”操作按钮的信息提示控件
图 1. Snackbar,带有用于恢复已移除内容的撤消操作按钮。

如需向 Snackbar 消息添加操作,请定义一个实现 View.OnClickListener 接口的监听器对象。如果用户点按消息操作,系统会调用监听器的 onClick() 方法。例如,以下代码段展示了用于执行撤消操作的监听器:

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.
    }
}

使用其中一种 setAction() 方法将监听器附加到您的 Snackbar。请在调用 show() 之前附加监听器,如以下代码示例所示:

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();
如果您使用的是 Jetpack Compose,则可以显示 SnackbarHost,如以下示例所示:

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") }
                  }
              )
          }
      }
  }