Hộp thoại

Thành phần Dialog hiển thị thông báo trong hộp thoại hoặc yêu cầu hoạt động đầu vào của người dùng trên một lớp phía trên nội dung chính của ứng dụng. Thành phần này tạo ra trải nghiệm gián đoạn trên giao diện người dùng để thu hút sự chú ý của người dùng.

Sau đây là một số trường hợp sử dụng hộp thoại:

  • Xác nhận hành động của người dùng, chẳng hạn như khi xoá một tệp.
  • Yêu cầu hoạt động đầu vào của người dùng, chẳng hạn như trong ứng dụng danh sách việc cần làm.
  • Trình bày danh sách các lựa chọn để người dùng chọn, chẳng hạn như chọn quốc gia trong quá trình thiết lập hồ sơ.
Một hộp thoại chứa văn bản và biểu tượng.
Hình 1. Ví dụ về hộp thoại chứa văn bản và biểu tượng.

Hộp thoại thông báo

Thành phần kết hợp AlertDialog cung cấp một API tiện lợi để tạo hộp thoại theo chủ đề Material Design. AlertDialog có các tham số cụ thể để xử lý các phần tử cụ thể của hộp thoại. Sau đây là một số tham số trong đó:

  • title: Văn bản xuất hiện ở đầu hộp thoại.
  • text: Văn bản xuất hiện ở giữa hộp thoại.
  • icon: Hình ảnh xuất hiện ở đầu hộp thoại.
  • onDismissRequest: Hàm được gọi khi người dùng đóng hộp thoại, chẳng hạn như bằng cách nhấn vào bên ngoài hộp thoại.
  • dismissButton: Một thành phần kết hợp đóng vai trò là nút đóng.
  • confirmButton: Một thành phần kết hợp đóng vai trò là nút xác nhận.

Ví dụ sau đây triển khai 2 nút trong hộp thoại thông báo, một nút đóng hộp thoại và một nút xác nhận yêu cầu của hộp thoại.

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

Quy trình triển khai này ngụ ý một thành phần kết hợp mẹ truyền các đối số cho thành phần kết hợp con theo cách sau:

@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ương thức triển khai có dạng như sau:

Một hộp thoại cảnh báo đang mở có cả nút đóng và nút xác nhận.
Hình 2. Hộp thoại thông báo có các nút.

Thành phần kết hợp của hộp thoại

Dialog là một thành phần kết hợp cơ bản không cung cấp bất kỳ kiểu nào hoặc các vị trí được xác định trước cho nội dung. Đây là một vùng chứa tương đối đơn giản mà bạn nên điền bằng một vùng chứa như Card. Sau đây là một số tham số chính của hộp thoại:

  • onDismissRequest: Lambda được gọi khi người dùng đóng hộp thoại.
  • properties: Một thực thể của DialogProperties cung cấp một số phạm vi bổ sung để tuỳ chỉnh.

Ví dụ cơ bản

Ví dụ sau đây là một quy trình triển khai cơ bản của thành phần kết hợp Dialog. Xin lưu ý rằng thành phần này sử dụng Card làm vùng chứa thứ hai. Nếu không có Card, thành phần Text sẽ chỉ xuất hiện phía trên nội dung chính của ứng dụng.

@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ương thức triển khai có dạng như sau. Xin lưu ý rằng khi hộp thoại mở, nội dung chính của ứng dụng bên dưới hộp thoại sẽ xuất hiện ở dạng tối và mờ:

Một hộp thoại chỉ chứa nhãn.
Hình 3. Hộp thoại tối giản.

Ví dụ nâng cao

Sau đây là một quy trình triển khai nâng cao hơn của thành phần kết hợp Dialog. Trong trường hợp này, thành phần này sẽ triển khai thủ công một giao diện tương tự như ví dụ AlertDialog trước đó.

@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ương thức triển khai có dạng như sau:

Một hộp thoại hiển thị Núi Feathertop, Victoria, có nút đóng và nút xác nhận.
Hình 4. Hộp thoại có hình ảnh.

Tài nguyên khác