Флажки позволяют пользователям выбирать один или несколько элементов из списка. Флажок можно использовать, чтобы пользователь мог:
- Включить или отключить элемент.
- Выбрать несколько вариантов из списка.
- Укажите согласие или принятие.
Анатомия
Флажок состоит из следующих элементов:
- Поле – контейнер для флажка.
- Флажок. Визуальный индикатор, показывающий, установлен ли флажок.
- Ярлык. Текст, описывающий флажок.
Штаты
У флажка может быть три состояния:
- Не выбрано – флажок не установлен. Поле пустое.
- Неопределенное состояние. Флажок находится в неопределенном состоянии. В поле есть дефис.
- Выбрано – флажок установлен. В поле установлен флажок.
На изображении ниже показаны три состояния флажка.
Реализация
Чтобы создать флажок в приложении, используйте composable-функцию Checkbox. При этом нужно учитывать несколько ключевых параметров:
checked– логическое значение, указывающее, установлен ли флажок.onCheckedChange()– функция, которую вызывает приложение, когда пользователь нажимает на флажок.
В следующем фрагменте кода показано, как использовать composable-функцию Checkbox:
@Composable fun CheckboxMinimalExample() { var checked by remember { mutableStateOf(true) } Row( verticalAlignment = Alignment.CenterVertically, ) { Text( "Minimal checkbox" ) Checkbox( checked = checked, onCheckedChange = { checked = it } ) } Text( if (checked) "Checkbox is checked" else "Checkbox is unchecked" ) }
Описание
Этот код создает флажок, который изначально не установлен. Когда пользователь нажимает на флажок, лямбда-функция onCheckedChange обновляет состояние checked.
Результат
Если снять флажок, будет создан следующий компонент:
А вот как выглядит этот флажок, когда он установлен:
Расширенный пример
Ниже приведен более сложный пример того, как можно реализовать флажки в приложении. В этом фрагменте кода есть родительский флажок и несколько дочерних. Когда пользователь нажимает на флажок родительского элемента, приложение устанавливает все флажки дочерних элементов.
@Composable fun CheckboxParentExample() { // Initialize states for the child checkboxes val childCheckedStates = remember { mutableStateListOf(false, false, false) } // Compute the parent state based on children's states val parentState = when { childCheckedStates.all { it } -> ToggleableState.On childCheckedStates.none { it } -> ToggleableState.Off else -> ToggleableState.Indeterminate } Column { // Parent TriStateCheckbox Row( verticalAlignment = Alignment.CenterVertically, ) { Text("Select all") TriStateCheckbox( state = parentState, onClick = { // Determine new state based on current state val newState = parentState != ToggleableState.On childCheckedStates.forEachIndexed { index, _ -> childCheckedStates[index] = newState } } ) } // Child Checkboxes childCheckedStates.forEachIndexed { index, checked -> Row( verticalAlignment = Alignment.CenterVertically, ) { Text("Option ${index + 1}") Checkbox( checked = checked, onCheckedChange = { isChecked -> // Update the individual child state childCheckedStates[index] = isChecked } ) } } } if (childCheckedStates.all { it }) { Text("All options selected") } }
Описание
Из этого примера можно сделать следующие выводы:
- Управление состоянием:
childCheckedStates– список логических значений, в котором с помощьюmutableStateOf()отслеживается состояние каждого дочернего флажка.parentState:ToggleableState, значение которого определяется состояниями дочерних флажков.
- Компоненты интерфейса:
TriStateCheckbox: необходим для флажка родителя, поскольку у него есть параметрstate, который позволяет установить неопределенное состояние.Checkbox– используется для каждого дочернего флажка, состояние которого связано с соответствующим элементом вchildCheckedStates.Text– показывает ярлыки и сообщения ("Выбрать все", "Вариант X", "Все варианты выбраны").
- Логика:
- Если установить флажок родительского элемента
onClick, все флажки дочерних элементов будут изменены на противоположное значение. - Каждый дочерний флажок
onCheckedChangeобновляет соответствующее состояние в спискеchildCheckedStates. - Если все дочерние флажки установлены, код будет выглядеть так:
All options selected.
- Если установить флажок родительского элемента
Результат
В этом примере, если снять все флажки, будет создан следующий компонент:
Ниже показано, как выглядит компонент, когда выбраны все варианты (например, когда пользователь нажимает "Выбрать все"):
Если выбран только один вариант, родительский флажок будет в неопределенном состоянии: