مربّعات حوار لأدوات اختيار الوقت

غالبًا ما تظهر أدوات اختيار الوقت في مربّعات الحوار. يمكنك استخدام تنفيذ عام وبسيط نسبيًا لمربّع حوار، أو يمكنك تنفيذ مربّع حوار مخصّص بمزيد من المرونة.

لمزيد من المعلومات عن مربّعات الحوار بشكل عام، بما في ذلك كيفية استخدام حالة أداة اختيار الوقت، يُرجى الاطّلاع على دليل أدوات اختيار الوقت.

مثال أساسي

أسهل طريقة لإنشاء مربّع حوار لأداة اختيار الوقت هي إنشاء دالة مركّبة تنفّذ AlertDialog. يوضّح المقتطف التالي مثالاً على مربّع حوار بسيط نسبيًا باستخدام هذا الأسلوب:

@Composable
fun DialWithDialogExample(
    onConfirm: (TimePickerState) -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    TimePickerDialog(
        onDismiss = { onDismiss() },
        onConfirm = { onConfirm(timePickerState) }
    ) {
        TimePicker(
            state = timePickerState,
        )
    }
}

@Composable
fun TimePickerDialog(
    onDismiss: () -> Unit,
    onConfirm: () -> Unit,
    content: @Composable () -> Unit
) {
    AlertDialog(
        onDismissRequest = onDismiss,
        dismissButton = {
            TextButton(onClick = { onDismiss() }) {
                Text("Dismiss")
            }
        },
        confirmButton = {
            TextButton(onClick = { onConfirm() }) {
                Text("OK")
            }
        },
        text = { content() }
    )
}

لاحظ النقاط الرئيسية في هذا المقتطف:

  1. يغلّف العنصر المركّب DialWithDialogExample TimePicker في مربّع حوار.
  2. ‫TimePickerDialog هي دالة مركّبة مخصّصة تنشئ AlertDialog باستخدام المَعلمات التالية:
    • ‫onDismiss: دالة يتم استدعاؤها عندما يغلق المستخدم مربّع الحوار (من خلال زر الإغلاق أو زر الرجوع).
    • ‫onConfirm: دالة يتم استدعاؤها عندما ينقر المستخدم على الزر "حسنًا".
    • ‫content: دالة مركّبة تعرض أداة اختيار الوقت داخل مربّع الحوار.
  3. يشمل AlertDialog ما يلي:
    • زر إغلاق يحمل التصنيف "إغلاق".
    • زر تأكيد يحمل التصنيف "حسنًا"
    • محتوى أداة اختيار الوقت الذي تم تمريره كمَعلمة text.
  4. تعمل الدالة DialWithDialogExample على إعداد الدالة TimePickerState بالوقت الحالي وتمريرها إلى كل من الدالة TimePicker والدالة onConfirm.
أداة اختيار الوقت في AlertDialog التي تنفّذ عنوانًا ومفتاح تبديل الوضع وزرَّي الإغلاق والتأكيد
الشكل 1. أداة اختيار الوقت في AlertDialog

مثال متقدّم

يوضّح هذا المقتطف طريقة متقدّمة لتنفيذ مربّع حوار قابل للتخصيص لاختيار الوقت في Jetpack Compose.

@Composable
fun AdvancedTimePickerExample(
    onConfirm: (TimePickerState) -> Unit,
    onDismiss: () -> Unit,
) {

    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    /** Determines whether the time picker is dial or input */
    var showDial by remember { mutableStateOf(true) }

    /** The icon used for the icon button that switches from dial to input */
    val toggleIcon = if (showDial) {
        Icons.Filled.EditCalendar
    } else {
        Icons.Filled.AccessTime
    }

    AdvancedTimePickerDialog(
        onDismiss = { onDismiss() },
        onConfirm = { onConfirm(timePickerState) },
        toggle = {
            IconButton(onClick = { showDial = !showDial }) {
                Icon(
                    imageVector = toggleIcon,
                    contentDescription = "Time picker type toggle",
                )
            }
        },
    ) {
        if (showDial) {
            TimePicker(
                state = timePickerState,
            )
        } else {
            TimeInput(
                state = timePickerState,
            )
        }
    }
}

@Composable
fun AdvancedTimePickerDialog(
    title: String = "Select Time",
    onDismiss: () -> Unit,
    onConfirm: () -> Unit,
    toggle: @Composable () -> Unit = {},
    content: @Composable () -> Unit,
) {
    Dialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(usePlatformDefaultWidth = false),
    ) {
        Surface(
            shape = MaterialTheme.shapes.extraLarge,
            tonalElevation = 6.dp,
            modifier =
            Modifier
                .width(IntrinsicSize.Min)
                .height(IntrinsicSize.Min)
                .background(
                    shape = MaterialTheme.shapes.extraLarge,
                    color = MaterialTheme.colorScheme.surface
                ),
        ) {
            Column(
                modifier = Modifier.padding(24.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(bottom = 20.dp),
                    text = title,
                    style = MaterialTheme.typography.labelMedium
                )
                content()
                Row(
                    modifier = Modifier
                        .height(40.dp)
                        .fillMaxWidth()
                ) {
                    toggle()
                    Spacer(modifier = Modifier.weight(1f))
                    TextButton(onClick = onDismiss) { Text("Cancel") }
                    TextButton(onClick = onConfirm) { Text("OK") }
                }
            }
        }
    }
}

لاحظ النقاط الرئيسية في هذا المقتطف:

  1. تنشئ الدالة المركّبة AdvancedTimePickerExample مربّع حوار لاختيار الوقت قابل للتخصيص.
  2. يستخدم الدالة المركّبة Dialog للحصول على مرونة أكبر من AlertDialog.
  3. يتضمّن مربّع الحوار عنوانًا قابلاً للتخصيص وزر تبديل للتبديل بين وضعَي الاتصال والإدخال.
  4. يطبّق Surface الشكل والارتفاع على مربّع الحوار، مع IntrinsicSize.Min لكل من العرض والارتفاع.
  5. يوفّر التنسيقان Column وRow مكوّنات بنية مربّع الحوار.
  6. يتتبّع المثال وضع أداة الاختيار باستخدام showDial.
    • يؤدي استخدام IconButton إلى التبديل بين الأوضاع، وتعديل الرمز وفقًا لذلك.
    • يتبدّل محتوى مربّع الحوار بين TimePicker وTimeInput استنادًا إلى حالة showDial.

يوفّر هذا التنفيذ المتقدّم مربّع حوار لاختيار الوقت قابل للتخصيص وإعادة الاستخدام بشكل كبير، ويمكن أن يتكيّف مع حالات الاستخدام المختلفة في تطبيقك.

يظهر هذا التنفيذ على النحو التالي:

أداة اختيار الوقت في مربّع حوار مخصّص يتضمّن عنوانًا وزر تبديل الوضع وزرَّي الإغلاق والتأكيد
الشكل 2. أداة اختيار الوقت في مربّع حوار مخصّص

مراجع إضافية