يعرض مكوّن Dialog رسائل الحوار أو يطلب بيانات أدخلها المستخدم على طبقة أعلى من محتوى التطبيق الرئيسي. ويوفّر تجربة واجهة مستخدم مقاطِعة لجذب انتباه المستخدم.
في ما يلي بعض حالات استخدام مربّع الحوار:
- تأكيد إجراء المستخدم، مثلاً عند حذف ملف
- طلب بيانات أدخلها المستخدم، مثلاً في تطبيق قائمة مهام
- عرض قائمة بالخيارات ليختارها المستخدم، مثلاً اختيار بلد عند إعداد ملف شخصي
مربع حوار تنبيه
يوفّر العنصر المركّب AlertDialog واجهة برمجة تطبيقات ملائمة لإنشاء مربّع حوار مستند إلى تصميم
Material Design. ويتضمّن AlertDialog مَعلمات محدّدة للتعامل مع عناصر معيّنة في مربّع الحوار. في ما يلي بعضها:
title: النص الذي يظهر في أعلى مربّع الحوارtext: النص الذي يظهر في وسط مربّع الحوارicon: الرسم الذي يظهر في أعلى مربّع الحوارonDismissRequest: الدالة التي يتم استدعاؤها عندما يرفض المستخدم مربّع الحوار، مثلاً من خلال النقر خارجهdismissButton: دالة مركّبة تعمل كزر إغلاقconfirmButton: دالة مركّبة تعمل كزر تأكيد.
يُنفّذ المثال التالي زرّين في مربّع حوار تنبيه، أحدهما لرفض مربّع الحوار والآخر لتأكيد طلبه.
@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: هي دالة lambda يتم استدعاؤها عندما يغلق المستخدم مربّع الحوار.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") } } } } } }
يظهر هذا التنفيذ على النحو التالي: