You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中获取未选中单选按钮 优化三明治选择逻辑

优化RadioGroup控制三明治视图显示的简洁方案

嘿,作为Kotlin和Android新手,你已经迈出了超棒的一步!现在我们来把这个逻辑优化得更简洁、更易维护,再也不用手动维护要隐藏的ImageView列表啦~

思路:用数据类统一管理三明治配置

首先,我们可以把每个三明治的名称、价格、对应的ImageView、关联的RadioButton ID封装成一个数据类,把所有相关信息绑定在一起,避免重复冗余的代码。

具体实现步骤

  1. 定义三明治配置数据类
    在你的Activity/Fragment里添加这个数据类(也可以单独放在一个独立文件中):
data class SandwichOption(
    val name: String,
    val cost: Float,
    val imageView: ImageView,
    val radioButtonId: Int
)
  1. 初始化所有三明治的配置列表
    在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)
    )
}
  1. 彻底简化点击事件逻辑
    现在我们可以完全重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:23:16