在訊息中加入動作

試試 Compose 的方式
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 Compose 中新增通知。

您可以為 Snackbar 新增動作,讓使用者回覆您的訊息。這樣做時,Snackbar 會在訊息文字旁邊放置按鈕,使用者只要輕觸按鈕,就能觸發您的動作。舉例來說,電子郵件應用程式可能會在「電子郵件已封存」訊息上放置「取消」按鈕。如果使用者輕觸「undo」按鈕,應用程式就會將電子郵件從封存項目中取出。

圖片顯示含有「UNDO」動作按鈕的 Snackbar
圖 1Snackbar 中含有復原已刪除項目的「復原」動作按鈕。

如要在 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") }
                  }
              )
          }
      }
  }