Kotlin中能否将多个Android Widget作为参数传入函数实现统一逻辑?
问题描述
布局中包含多个Switch组件,点击这些组件时会修改SharedPreference的值来控制对应功能的启用状态(例如关闭funcOnOff则关闭语音通知,关闭fromOnOff则无法查看来电信息)。当前代码逻辑重复度极高,示例代码如下:
var funcOnOff: Switch = findViewById(R.id.func_on_off) var fromOnOff: Switch = findViewById(R.id.from_on_off) var timeOnOff: Switch = findViewById(R.id.time_on_off) var contentOnOff: Switch = findViewById(R.id.content_on_off) funcOnOff.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) { editor.putString("func", "ON") } else { editor.putString("func", "OFF") } editor.commit() } fromOnOff.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) { editor.putString("from", "ON") } else { editor.putString("from", "OFF") } editor.commit() } timeOnOff.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) { editor.putString("time", "ON") } else { editor.putString("time", "OFF") } editor.commit() }
希望将多个Switch组件传入统一函数,实现复用的处理逻辑。
优化方案
当然可以通过提取通用逻辑消除代码重复,以下是几种简洁的实现方式:
方式一:提取通用监听函数
定义一个工具函数,接收Switch和对应的SharedPreference键名,统一处理状态变更逻辑:
// 通用Switch状态处理函数 private fun bindSwitchToSP(switch: Switch, spKey: String) { switch.setOnCheckedChangeListener { _, isChecked -> // 根据开关状态写入对应值 editor.putString(spKey, if (isChecked) "ON" else "OFF") editor.commit() } } // 调用函数绑定所有Switch bindSwitchToSP(funcOnOff, "func") bindSwitchToSP(fromOnOff, "from") bindSwitchToSP(timeOnOff, "time") bindSwitchToSP(contentOnOff, "content")
方式二:用映射列表批量处理
如果需要绑定的Switch较多,可以将组件与键名的对应关系存入列表,通过循环批量设置监听,代码更简洁:
// 构建Switch与SP键名的映射对列表 val switchSpPairs = listOf( funcOnOff to "func", fromOnOff to "from", timeOnOff to "time", contentOnOff to "content" ) // 循环绑定监听 switchSpPairs.forEach { (switch, key) -> switch.setOnCheckedChangeListener { _, isChecked -> editor.putString(key, if (isChecked) "ON" else "OFF") editor.commit() } }
额外优化:使用布尔值存储状态
目前用字符串"ON"/"OFF"存储状态,其实SharedPreference支持直接存储布尔值,更高效且逻辑更清晰;同时推荐用apply()替代commit()(异步提交,避免阻塞主线程):
// 优化后的批量绑定逻辑 switchSpPairs.forEach { (switch, key) -> // 初始化Switch状态(可选,从SP读取当前值设置开关状态) switch.isChecked = sharedPreferences.getBoolean(key, true) switch.setOnCheckedChangeListener { _, isChecked -> editor.putBoolean(key, isChecked) editor.apply() } }
内容的提问来源于stack exchange,提问作者user18560558
相关产品推荐
相关产品推荐

