为消息添加操作

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

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

包含“撤消”操作按钮的 snackbar 通知
图 1. 包含用于恢复已移除项的撤消操作按钮的 Snackbar。

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

class MyUndoListener : View.OnClickListener {

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

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

val mySnackbar = Snackbar.make(
    findViewById(R.id.myCoordinatorLayout),
    R.string.email_archived,
    Snackbar.LENGTH_SHORT
)
mySnackbar.setAction(R.string.undo_string, MyUndoListener())
mySnackbar.show()
如果您使用的是 Jetpack Compose,则可以显示 SnackbarHost,如以下示例所示:
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") }
                }
            )
        }
    }
}