如何在Android Kotlin中使用View Binding精简按钮相关重复代码
代码精简方案
第一步:预收集按钮列表,消除重复绑定逻辑
首先提前把所有同类按钮收集为一个列表,避免逐个调用绑定方法:
// Fragment/Activity 成员变量 private val pearKindButtons by lazy { listOf( viewBinding.btnPearKind1, viewBinding.btnPearKind2, viewBinding.btnPearKind3, viewBinding.btnPearKind4, viewBinding.btnPearKind5, viewBinding.btnPearKind6 ) }
修改onViewCreated逻辑,批量绑定事件:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) pearKindButtons.forEach { bindSelectEvent(it) } }
第二步:优化选中逻辑,移除冗余查找操作
原来的实现每次点击都需要通过Tag反复查找视图,性能低且代码冗余,直接操作预收集的按钮列表即可:
private fun bindSelectEvent(selectedBtn: Button) { selectedBtn.setOnClickListener { pearKindButtons.forEach { btn -> val tintRes = if (btn == selectedBtn) R.color.btn_color else R.color.btn_color_off btn.backgroundTintList = ContextCompat.getColorStateList(it.context, tintRes) } } }
如果业务逻辑必须依赖Tag判断,可调整为以下版本:
private fun bindSelectEvent(selectedBtn: Button) { selectedBtn.setOnClickListener { val selectedTag = selectedBtn.tag pearKindButtons.forEach { btn -> val tintRes = if (btn.tag == selectedTag) R.color.btn_color else R.color.btn_color_off btn.backgroundTintList = ContextCompat.getColorStateList(it.context, tintRes) } } }
进阶优化:无需手动维护按钮列表
如果kindGrid容器内只有这几个选择按钮,可以直接遍历子视图自动收集按钮,后续新增按钮无需修改列表代码:
private val pearKindButtons by lazy { viewBinding.kindGrid.children.filterIsInstance<Button>().toList() }
优化收益
- 消除了逐个调用绑定方法的重复代码
- 移除了每次点击时重复执行
findViewWithTag的性能开销 - 逻辑更加聚合,后续新增同类按钮只需在布局中添加即可,无需修改业务代码
内容的提问来源于stack exchange,提问作者GreenHelix
相关产品推荐
相关产品推荐

