Переключение между несколькими состояниями в пользовательском интерфейсе Android

Для обработки двойного состояния в Jetpack Compose (например, переключение между дневным и ночным режимами) мы используем переключатель, например:

val checkedState = remember { mutableStateOf(true) }
Switch( checked = checkedState.value, onCheckedChange = { checkedState.value = it }
)

Но Compose не предоставляет никаких компонентов, которые позволили бы нам обрабатывать несколько состояний.

Например, вместо дневного и ночного режима мы хотим иметь дневное, ночное и вечернее состояния. Или эти состояния могут расти в числе. Одно из решений состоит в том, что мы можем использовать RadioGroup с RadioButtons, но это выглядит некрасиво.

Чтобы преодолеть это, мы можем разработать нашу пользовательскую кнопку состояния переключения, которая будет иметь более двух состояний. Во-первых, давайте посмотрим на код.

Во-первых, мы создаем список состояний, который будет определять, сколько состояний будет у кнопки-переключателя.

Затем мы создаем selectedOption, не забывая пережить изменения конфигурации, которые сохранят текущее значение активного состояния.

Затем лямбда для обновления значения параметра selected.

val onSelectionChange = { text: String ->        
    selectedOption = text    
}

Затем мы создаем представление верхнего уровня в качестве поверхности, чтобы придать нашей кнопке приятный вид. И чтобы он обернул контент, который у него есть в виде children представлений, мы используем:

Modifier.wrapContentSize()

Затем, чтобы имитировать внешний вид красивой кнопки-переключателя, мы используем Row. И придать ему круглую форму для более гладкого вида.

Затем мы перебираем наш список states, чтобы добавить необходимые состояния в строку. В атрибуте clickable мы обновляем значение selectedOption текстом выбранного элемента.

.clickable {
    onSelectionChange(text)                        
}

В атрибуте background мы проверяем, является ли элемент выбранным, и если это правда, то меняем его цвет фона на «пурпурный», в противном случае сохраняем его на «светло-серый».

Это основной элемент имитации кнопки-переключателя. Поскольку выбранный элемент будет другого цвета, чем остальные.

Примечание. Вы можете изменить этот атрибут фона в соответствии с вашими требованиями к дизайну.

.background(  
if (text == selectedOption) {
     Color.Magenta
} else {                                
     Color.LightGray                           
  }                       
)

Вы можете использовать значение selectedItem для достижения результата.

В итоге окончательный результат будет выглядеть так.

Спасибо, это все.