ダイアログ

Dialog コンポーネントは、ポップアップ メッセージを表示するか、 レイヤに配置できます。これにより、中断を伴う UI エクスペリエンスが生み出され、 ユーザーの注意を引くことができます

ダイアログのユースケースには次のようなものがあります。

  • ユーザーの操作を確認する(ファイルの削除時など)。
  • ToDo リスト アプリなどでユーザー入力をリクエストする。
  • ユーザー選択のオプションのリストを提示する(たとえば、 プロファイル設定です。
テキストとアイコンが入力されたダイアログ。
図 1. テキストとアイコンが入力されたダイアログの例

通知ダイアログ

AlertDialog コンポーザブルは、 マテリアル デザインをテーマにしたダイアログ。AlertDialog には次のパラメータがあります。 ダイアログの特定の要素を処理しますその一例は次のとおりです。

  • title: ダイアログの上部に表示されるテキスト。
  • text: ダイアログ内で中央に表示されるテキスト。
  • icon: ダイアログの上部に表示されるグラフィック。
  • onDismissRequest: ユーザーがダイアログを閉じると呼び出される関数。 画面の外側をタップするといった操作です。
  • dismissButton: 閉じるボタンとして機能するコンポーザブル。
  • confirmButton: 確認ボタンとして機能するコンポーザブル。

次の例では、アラート ダイアログに 2 つのボタンを実装しています。 ダイアログを閉じるコマンドと、リクエストを確認するコマンドの 2 つです。

@OptIn(ExperimentalMaterial3Api::class)
@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
                )
            }
        }
    }
}

これを実装すると次のようになります。

<ph type="x-smartling-placeholder">
</ph> 閉じるボタンと確認ボタンの両方があるアラート ダイアログが開いている。
図 2.ボタン付きのアラート ダイアログ

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

この実装は次のようになります。ダイアログを開くと、 その下のメインアプリのコンテンツが暗くグレー表示されます。

<ph type="x-smartling-placeholder">
</ph> ラベルのみを含むダイアログ。
図 3.最小限の会話。

高度な例

以下は、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")
                    }
                }
            }
        }
    }
}

これを実装すると次のようになります。

<ph type="x-smartling-placeholder">
</ph> ビクトリア州のフェザートップ山の写真が表示されたダイアログ。画像の下には閉じるボタンと確認ボタンがあります。
図 4.画像を含むダイアログ。

参考情報