Диалоги для выбора времени

Инструменты выбора времени часто появляются в диалогах. Вы можете использовать относительно общую и минимальную реализацию диалога или реализовать собственный диалог с большей гибкостью.

Дополнительную информацию о диалогах в целом, в том числе о том, как использовать состояние выбора времени, см. в руководстве по выбору времени .

Базовый пример

Самый простой способ создать диалоговое окно для выбора времени — создать составной объект, реализующий 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),
        is
24Hour = 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),
        is
24Hour = 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. Средство выбора времени в пользовательском диалоговом окне.

Дополнительные ресурсы