Нужен эффективный способ обновления представления по клику для списка категорий

У меня есть представление, в котором мне нужно выбрать одну из трех категорий.

Каждая категория — это кнопка.

Выбранная категория должна иметь черный фон с белым текстом, в то время как другие категории должны иметь белый фон с черным текстом.

Я сделал это, создав кнопку для каждой категории и обновив ее при каждом нажатии. Есть ли лучший способ сделать это?

Что делать, если количество категорий не фиксировано?

val filterBoth: Button = parentView.findViewById(R.id.filter_both)
val filterVeg: Button = parentView.findViewById(R.id.filter_veg)
val filterNonveg: Button = parentView.findViewById(R.id.filter_nonveg)

filterBoth.setOnClickListener(this)
filterVeg.setOnClickListener(this)
filterNonveg.setOnClickListener(this)

override fun onClick(view: View?) {
    filterBoth.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterBoth.setTextColor(R.color.black)
    filterVeg.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterVeg.setTextColor(R.color.black)
    filterNonveg.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterNonveg.setTextColor(R.color.black)
    when(view?.id) {
        R.id.filter_both -> {
            filterBoth.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterBoth.setTextColor(R.color.white)
        }
        R.id.filter_veg -> {
            filterVeg.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterVeg.setTextColor(R.color.white)
        }
        R.id.filter_nonveg -> {
            filterNonveg.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterNonveg.setTextColor(R.color.white)
        }
    }
}

РЕДАКТИРОВАТЬ Могу ли я как-то использовать RadioButton и RadioGroup для этой функциональности? Как настроить вид радиокнопки на настраиваемый вид как для отмеченного, так и для непроверенного состояния?

stackoverflow.com/a/55139080/12148482
vipul_8192 16.05.2022 08:28
0
1
24
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать что-то вроде этого:

val filterButtons = listOf(filterBoth, filterVeg, filterNonveg)
filterButtons.forEach { btn ->
    btn.setOnClickListener {
        filterButtons.forEach {
            val bgColor = if (it == btn) R.color.black else R.color.white
            val textColor = if (it == btn) R.color.white else R.color.black
            it.backgroundTintList = ColorStateList.valueOf(bgColor)
            it.setTextColor(textColor)
        }
    }
}

What to do if the number of categories is not fixed?

Просто добавьте больше кнопок в список filterButtons, и все остальное останется прежним.

Спасибо за код. При дальнейшем изучении, могу ли я установить пользовательский вид в переключателе, так как это позволит достичь той же цели

vipul_8192 15.05.2022 16:39

Кажется, это совсем другой вопрос. Вы должны опубликовать это как новый вопрос.

Arpit Shukla 15.05.2022 18:04

Вы можете использовать MaterialToggleButtonGroup с singleSelection установленным на true. Таким образом, вы можете оформить их как обычно, все обычные состояния кнопок (например, при наведении курсора) будут выглядеть правильно, они будут автоматически снимать галочку, если установлен другой флажок, и они будут лучше работать со службами специальных возможностей.

Вы можете использовать addOnButtonCheckedListener в макете группы для обработки одной из выбранных кнопок.

Документы по дизайну материалов тоже здесь: https://material.io/components/buttons/android#кнопка-переключатель

Другие вопросы по теме