需要有效的方法来更新点击类别列表的视图
Need efficient way to update view on click for category list
我有一个观点,我需要 select 三个类别之一。
每个类别都是一个按钮。
所选类别应为黑底白字,而其他类别应为白底黑字。
我是通过为每个类别创建按钮并在每个点击事件上更新来完成的。 有没有更好的方法呢?
类别数不固定怎么办?
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 来实现此功能吗?如何将单选按钮视图设置为选中和未选中状态的自定义视图?
您可以尝试这样的操作:
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
列表中添加更多按钮,其他一切保持不变。
您可以使用 MaterialToggleButtonGroup
并将 singleSelection
设置为 true。这样你就可以像往常一样为它们设置主题,所有常见的按钮状态(如悬停)看起来都是正确的,如果另一个被选中它们会自动取消选中,并且它们会更好地与无障碍服务一起工作。
您可以在组布局上使用 addOnButtonCheckedListener
来处理被选中的按钮之一。
Material 此处也有设计文档:https://material.io/components/buttons/android#toggle-button
我有一个观点,我需要 select 三个类别之一。
每个类别都是一个按钮。
所选类别应为黑底白字,而其他类别应为白底黑字。
我是通过为每个类别创建按钮并在每个点击事件上更新来完成的。 有没有更好的方法呢?
类别数不固定怎么办?
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 来实现此功能吗?如何将单选按钮视图设置为选中和未选中状态的自定义视图?
您可以尝试这样的操作:
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
列表中添加更多按钮,其他一切保持不变。
您可以使用 MaterialToggleButtonGroup
并将 singleSelection
设置为 true。这样你就可以像往常一样为它们设置主题,所有常见的按钮状态(如悬停)看起来都是正确的,如果另一个被选中它们会自动取消选中,并且它们会更好地与无障碍服务一起工作。
您可以在组布局上使用 addOnButtonCheckedListener
来处理被选中的按钮之一。
Material 此处也有设计文档:https://material.io/components/buttons/android#toggle-button