メッセージにアクションを追加する

Compose をお試しください
Jetpack Compose は、Android で推奨される UI ツールキットです。Compose で通知を追加する方法について学習します。

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