Dialog

Mit der Komponente Dialog werden Pop-up-Nachrichten angezeigt oder Nutzereingaben auf einer Ebene über dem Hauptinhalt der App angefordert. Sie erzeugt eine störende Benutzeroberfläche, um die Aufmerksamkeit der Nutzer zu wecken.

Ein Dialogfeld wird unter anderem in folgenden Anwendungsfällen eingesetzt:

  • Bestätigung der Nutzeraktion, z. B. beim Löschen einer Datei
  • Nutzereingabe anfordern, beispielsweise in einer App für To-do-Listen
  • Eine Liste mit Optionen für die Nutzerauswahl wird angezeigt, z. B. die Auswahl eines Landes in einer Profileinrichtung.
Ein Dialogfeld mit Text und Symbolen.
Abbildung 1. Beispiel für einen Dialog mit Text und Symbolen.

Dialogfeld einer Benachrichtigung

Die zusammensetzbare API AlertDialog bietet eine bequeme API zum Erstellen eines Dialogfelds im Material Design-Design. AlertDialog hat bestimmte Parameter für die Verarbeitung bestimmter Elemente des Dialogfelds. Dazu gehören:

  • title: Der Text, der oben im Dialogfeld angezeigt wird.
  • text: Der Text, der in der Mitte des Dialogfelds angezeigt wird.
  • icon: Die Grafik, die oben im Dialogfeld angezeigt wird.
  • onDismissRequest: Die Funktion, die aufgerufen wird, wenn der Nutzer das Dialogfeld schließt, z. B. durch Tippen außerhalb des Dialogfelds.
  • dismissButton: Eine zusammensetzbare Funktion, die als Schaltfläche zum Schließen dient.
  • confirmButton: Eine zusammensetzbare Funktion, die als Bestätigungsschaltfläche dient.

Im folgenden Beispiel werden zwei Schaltflächen in einem Dialogfeld für Benachrichtigungen implementiert: eine zum Schließen des Dialogfelds und eine zum Bestätigen der Anfrage.

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

Diese Implementierung impliziert eine übergeordnete zusammensetzbare Funktion, die Argumente so an die untergeordnete zusammensetzbare Funktion übergibt:

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

Diese Implementierung sieht so aus:

Ein geöffnetes Dialogfeld mit einer Benachrichtigung mit den Schaltflächen „Schließen“ und „Bestätigen“.
Abbildung 2: Ein Dialogfeld für Benachrichtigungen mit Schaltflächen.

Dialogfeld zusammensetzbare Funktionen

Dialog ist eine einfache zusammensetzbare Funktion, die keine Stile oder vordefinierte Slots für Inhalte bietet. Es handelt sich um einen relativ einfachen Container, den Sie mit einem Container wie Card füllen sollten. Im Folgenden sind einige der wichtigsten Parameter eines Dialogfelds aufgeführt:

  • onDismissRequest: Lambda-Funktion, die aufgerufen wird, wenn der Nutzer das Dialogfeld schließt.
  • properties: Eine Instanz von DialogProperties, die zusätzliche Anpassungsmöglichkeiten bietet.

Einfaches Beispiel

Das folgende Beispiel zeigt eine einfache Implementierung der zusammensetzbaren Funktion Dialog. Dabei wird ein Card als sekundärer Container verwendet. Ohne Card würde die Komponente Text allein über den Hauptinhalten der App angezeigt werden.

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

Diese Implementierung sieht so aus: Wenn das Dialogfeld geöffnet ist, wird der Hauptinhalt der App darunter abgedunkelt und ausgegraut dargestellt:

Ein Dialogfeld, das ausschließlich ein Label enthält.
Abbildung 3: Minimaler Dialog.

Erweitertes Beispiel

Im Folgenden finden Sie eine erweiterte Implementierung der zusammensetzbaren Funktion Dialog. In diesem Fall implementiert die Komponente manuell eine ähnliche Schnittstelle wie im obigen AlertDialog-Beispiel.

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

Diese Implementierung sieht so aus:

Ein Dialogfeld mit einem Foto von Mount Feathertop in Victoria. Unter dem Bild befinden sich eine Schaltfläche zum Schließen und eine Schaltfläche zum Bestätigen.
Abbildung 4: Ein Dialogfeld mit einem Bild.

Weitere Informationen