Dialog コンポーネントは、メインのアプリ コンテンツの上の
レイヤにダイアログ メッセージを表示したり、ユーザー入力のリクエストを表示したりします。ユーザーの注意を引くための割り込み型の UI エクスペリエンスを作成します。
ダイアログのユースケースには、次のようなものがあります。
- ファイルの削除など、ユーザー操作の確認。
- To-Do リスト アプリなどでのユーザー入力のリクエスト。
- プロファイルの設定で国を選択するなど、ユーザーが選択できるオプションのリストの表示。
通知ダイアログ
AlertDialog コンポーザブルは、
マテリアル デザインのテーマ設定されたダイアログを作成するための便利な API を提供します。AlertDialog には、ダイアログの特定の要素を処理するための固有のパラメータがあります。その一部を次に示します。
title: ダイアログの上部に表示されるテキスト。text: ダイアログの中央に表示されるテキスト。icon: ダイアログの上部に表示されるグラフィック。onDismissRequest: ユーザーがダイアログの外側をタップするなどしてダイアログを閉じたときに呼び出される関数。dismissButton: 閉じるボタンとして機能するコンポーザブル。confirmButton: 確認ボタンとして機能するコンポーザブル。
次の例では、通知ダイアログに 2 つのボタンを実装しています。1 つはダイアログを閉じるボタン、もう 1 つはリクエストを確認するボタンです。
@Composable fun AlertDialogExample( onDismissRequest: () -> Unit, onConfirmation: () -> Unit, dialogTitle: String, dialogText: String, icon: ImageVector, ) { AlertDialog( icon = { Icon(icon, contentDescription = "Example Icon") }, title = { Text(text = dialogTitle) }, text = { Text(text = dialogText) }, onDismissRequest = { onDismissRequest() }, confirmButton = { TextButton( onClick = { onConfirmation() } ) { Text("Confirm") } }, dismissButton = { TextButton( onClick = { onDismissRequest() } ) { Text("Dismiss") } } ) }
この実装では、親コンポーザブルが次のように引数を子コンポーザブルに渡すことを前提としています。
@Composable fun DialogExamples() { // ... val openAlertDialog = remember { mutableStateOf(false) } // ... when { // ... openAlertDialog.value -> { AlertDialogExample( onDismissRequest = { openAlertDialog.value = false }, onConfirmation = { openAlertDialog.value = false println("Confirmation registered") // Add logic here to handle confirmation. }, dialogTitle = "Alert dialog example", dialogText = "This is an example of an alert dialog with buttons.", icon = Icons.Default.Info ) } } } }
これを実装すると次のようになります。
Dialog コンポーザブル
Dialog は、スタイリングやコンテンツの事前定義されたスロットを提供しない基本的なコンポーザブルです。Card などのコンテナを入力する必要がある比較的シンプルなコンテナです。ダイアログの主なパラメータは次のとおりです。
onDismissRequest: ユーザーがダイアログを閉じたときに呼び出されるラムダ。properties: カスタマイズのための 追加スコープを提供するDialogPropertiesのインスタンス。
基本的な例
次の例は、Dialog コンポーザブルの基本的な実装です。セカンダリ コンテナとして Card を使用していることに注意してください。Card がないと、Text コンポーネントはメインのアプリ コンテンツの上に単独で表示されます。
@Composable fun MinimalDialog(onDismissRequest: () -> Unit) { Dialog(onDismissRequest = { onDismissRequest() }) { Card( modifier = Modifier .fillMaxWidth() .height(200.dp) .padding(16.dp), shape = RoundedCornerShape(16.dp), ) { Text( text = "This is a minimal dialog", modifier = Modifier .fillMaxSize() .wrapContentSize(Alignment.Center), textAlign = TextAlign.Center, ) } } }
これを実装すると次のようになります。ダイアログが開いているときは、その下のメインのアプリ コンテンツが暗く表示され、グレー表示になることに注意してください。
高度な例
次は、Dialog コンポーザブルのより高度な実装です。この場合、コンポーネントは上記の AlertDialog の例と同様のインターフェースを手動で実装します。
@Composable fun DialogWithImage( onDismissRequest: () -> Unit, onConfirmation: () -> Unit, painter: Painter, imageDescription: String, ) { Dialog(onDismissRequest = { onDismissRequest() }) { // Draw a rectangle shape with rounded corners inside the dialog Card( modifier = Modifier .fillMaxWidth() .height(375.dp) .padding(16.dp), shape = RoundedCornerShape(16.dp), ) { Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { Image( painter = painter, contentDescription = imageDescription, contentScale = ContentScale.Fit, modifier = Modifier .height(160.dp) ) Text( text = "This is a dialog with buttons and an image.", modifier = Modifier.padding(16.dp), ) Row( modifier = Modifier .fillMaxWidth(), horizontalArrangement = Arrangement.Center, ) { TextButton( onClick = { onDismissRequest() }, modifier = Modifier.padding(8.dp), ) { Text("Dismiss") } TextButton( onClick = { onConfirmation() }, modifier = Modifier.padding(8.dp), ) { Text("Confirm") } } } } } }
これを実装すると次のようになります。