टाइम पिकर के लिए डायलॉग

टाइम पिकर अक्सर डायलॉग में दिखते हैं. डायलॉग को सामान्य और कम से कम शब्दों में लागू किया जा सकता है. इसके अलावा, अपनी पसंद के मुताबिक डायलॉग को ज़्यादा शब्दों में भी लागू किया जा सकता है.

डायलॉग के बारे में ज़्यादा जानकारी के लिए, टाइम पिकर गाइड देखें. इसमें टाइम पिकर की स्थिति को इस्तेमाल करने का तरीका भी शामिल है.

बुनियादी उदाहरण

टाइम पिकर के लिए डायलॉग बनाने का सबसे आसान तरीका यह है कि 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 में मौजूद टाइम पिकर है. इसमें टाइटल, मोड टॉगल, और खारिज करने और पुष्टि करने वाले बटन शामिल होते हैं.
पहली इमेज. 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. यह AlertDialog की तुलना में ज़्यादा विकल्प देने के लिए, Dialog कंपोज़ेबल का इस्तेमाल करता है.
  3. डायलॉग में, पसंद के मुताबिक बनाया जा सकने वाला टाइटल और डायल और इनपुट मोड के बीच स्विच करने के लिए टॉगल बटन शामिल होता है.
  4. Surface, डायलॉग पर शेप और एलिवेशन लागू करता है. साथ ही, IntrinsicSize.Min चौड़ाई और ऊंचाई, दोनों के लिए होता है.
  5. Column और Row लेआउट, डायलॉग के स्ट्रक्चर कॉम्पोनेंट उपलब्ध कराते हैं.
  6. इस उदाहरण में, showDial का इस्तेमाल करके पिकर मोड को ट्रैक किया जाता है.
    • IconButton आइकॉन, मोड के बीच टॉगल करता है. साथ ही, इसके हिसाब से आइकॉन को अपडेट करता है.
    • डायलॉग का कॉन्टेंट, showDial की स्थिति के आधार पर TimePicker और TimeInput के बीच स्विच करता है.

इस बेहतर तरीके से लागू करने पर, आपको टाइम पिकर का ऐसा डायलॉग मिलता है जिसे अपनी ज़रूरत के हिसाब से बनाया जा सकता है और बार-बार इस्तेमाल किया जा सकता है. यह आपके ऐप्लिकेशन में इस्तेमाल के अलग-अलग उदाहरणों के हिसाब से काम कर सकता है.

लागू होने पर यह ऐसा दिखता है:

कस्टम डायलॉग में टाइम पिकर. इसमें टाइटल, मोड टॉगल, और खारिज करने और पुष्टि करने वाले बटन शामिल होते हैं.
दूसरी इमेज. कस्टम डायलॉग में टाइम पिकर.

अन्य संसाधन