在訊息中加入動作

試試 Compose
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 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") }
                }
            )
        }
    }
}