Android Kotlin中获取未选中单选按钮 优化三明治选择逻辑
优化RadioGroup控制三明治视图显示的简洁方案
嘿,作为Kotlin和Android新手,你已经迈出了超棒的一步!现在我们来把这个逻辑优化得更简洁、更易维护,再也不用手动维护要隐藏的ImageView列表啦~
思路:用数据类统一管理三明治配置
首先,我们可以把每个三明治的名称、价格、对应的ImageView、关联的RadioButton ID封装成一个数据类,把所有相关信息绑定在一起,避免重复冗余的代码。
具体实现步骤
- 定义三明治配置数据类
在你的Activity/Fragment里添加这个数据类(也可以单独放在一个独立文件中):
data class SandwichOption( val name: String, val cost: Float, val imageView: ImageView, val radioButtonId: Int )
- 初始化所有三明治的配置列表
在Activity的onCreate方法里,借助ViewBinding把所有三明治的信息整理成一个统一列表:
private lateinit var sandwichOptions: List<SandwichOption> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = YourLayoutBinding.inflate(layoutInflater) setContentView(binding.root) // 初始化三明治配置列表,把所有关联信息绑定在一起 sandwichOptions = listOf( SandwichOption("Panini", 7.0f, binding.panini, R.id.panini_button), SandwichOption("Hoagie", 10.0f, binding.hoagie, R.id.hoagie_button), SandwichOption("Melt", 5.0f, binding.sandwich, R.id.sandwich_button) ) }
- 彻底简化点击事件逻辑
现在我们可以完全重构onSandwichRadioButtonClicked函数,不用再写重复的when分支:
fun onSandwichRadioButtonClicked(view: View) { if (view is RadioButton && view.isChecked) { // 根据选中的RadioButton ID找到对应的三明治配置 val selectedOption = sandwichOptions.find { it.radioButtonId == view.id } ?: return // 更新sandwich对象的属性,用apply函数让代码更简洁 sandwich.apply { name = selectedOption.name sandwichCost = selectedOption.cost totalCost = (extraCost + sandwichCost).toString() } // 遍历所有三明治配置,统一设置显示/隐藏状态 sandwichOptions.forEach { option -> option.imageView.visibility = if (option == selectedOption) View.VISIBLE else View.GONE } // 更新UI和弹出提示 binding.invalidateAll() Toast.makeText( this, "Total Cost: ${sandwich.totalCost}", Toast.LENGTH_SHORT ).show() } }
为什么这个方案更好?
- 减少重复代码:再也不用在每个when分支里手动添加要隐藏的ImageView,逻辑统一在遍历中处理
- 扩展性超强:如果以后要加新的三明治,只需要在
sandwichOptions列表里新增一个SandwichOption对象就行,完全不用修改点击事件的逻辑 - 逻辑更清晰:每个三明治的所有关联信息都绑定在一起,不容易出现漏写、错写的情况
另一种更轻量的备选方案(不想用数据类时)
如果你觉得数据类有点“重”,也可以直接把所有ImageView放到一个列表里,用更简单的方式处理:
// 初始化ImageView列表 private val sandwichImages = listOf(binding.panini, binding.hoagie, binding.sandwich) fun onSandwichRadioButtonClicked(view: View) { if (view is RadioButton && view.isChecked) { // 先把所有ImageView都隐藏 sandwichImages.forEach { it.visibility = View.GONE } // 根据选中的按钮设置对应的ImageView显示,并更新sandwich属性 when (view.id) { R.id.panini_button -> { binding.panini.visibility = View.VISIBLE sandwich.name = "Panini" sandwich.sandwichCost = 7.0f } R.id.hoagie_button -> { binding.hoagie.visibility = View.VISIBLE sandwich.name = "Hoagie" sandwich.sandwichCost = 10.0f } R.id.sandwich_button -> { binding.sandwich.visibility = View.VISIBLE sandwich.name = "Melt" sandwich.sandwichCost = 5.0f } } // 后续的更新逻辑不变 sandwich.totalCost = (sandwich.extraCost + sandwich.sandwichCost).toString() binding.invalidateAll() Toast.makeText( this, "Total Cost: ${sandwich.totalCost}", Toast.LENGTH_SHORT ).show() } }
这个方案比你之前的ArrayList方式更简洁,不用手动维护要隐藏的列表,直接先全隐藏再显示选中的即可。
内容的提问来源于stack exchange,提问作者Larissa Ford
相关产品推荐
相关产品推荐

