Kotlin中如何获取ImageButton图片资源并设置给其他ImageButton
问题背景
需求:将顶部被点击的ImageButton的当前图片资源,设置给底部的ImageButton。
动机:底部ImageButton作为顶部ImageButton最后一次点击的记录/备份。
应用设置:
- 顶部包含多个ImageButton
- 底部有一个单独的ImageButton
常见错误示例及原因
- 硬编码资源ID(无报错但未实现需求)
findViewById<ImageButton>(idR1).setOnClickListener { findViewById<ImageButton>(idR5_oppCiv).setImageResource(R.drawable.athen_cavalry_swordsman); }
直接写死目标图片资源,未获取点击按钮的当前图片,完全不符合需求。
- 错误的资源调用方式(无法运行)
findViewById<ImageButton>(idR1).setOnClickListener { findViewById<ImageButton>(idR5_oppCiv).setImageResource(it.resources.getDrawable()); }
it是点击事件的View参数,getResources().getDrawable()需要传入资源ID,无参调用会报错;且setImageResource要求传入Int类型的资源ID,与Drawable对象类型不匹配。
findViewById<ImageButton>(idR1).setOnClickListener { findViewById<ImageButton>(idR5_oppCiv).setImageResource(it.getImageResource()); }
View类不存在getImageResource()方法,会导致编译或运行报错。
- 错误的资源标识符获取(点击崩溃)
val resR1: Int = resources.getIdentifier("r1col$i", "res", this.packageName) findViewById<ImageButton>(idR1).setOnClickListener { findViewById<ImageButton>(idR5_oppCiv).setImageDrawable(getDrawable(resR1)) }
getIdentifier的第二个参数应为资源类型(如"drawable")而非"res",且r1col$i可能不是正确的资源名称,导致获取的resR1为0,调用getDrawable(0)会触发崩溃。
正确实现方案
方法1:直接获取Drawable并设置
核心是在点击事件中获取被点击按钮的当前Drawable,直接赋值给底部按钮:
// 提前缓存底部按钮,避免重复查找View val bottomBtn = findViewById<ImageButton>(idR5_oppCiv) findViewById<ImageButton>(idR1).setOnClickListener { clickedBtn -> // 强转为ImageButton并获取当前Drawable val currentDrawable = (clickedBtn as ImageButton).drawable // 若需避免多View共享Drawable状态,可调用mutate() bottomBtn.setImageDrawable(currentDrawable.mutate()) }
方法2:通过Tag绑定资源ID设置
如果需要保存资源ID用于后续复用,可在初始化时给顶部按钮绑定资源ID到tag属性:
// 初始化顶部按钮时绑定默认资源ID到tag val topBtn1 = findViewById<ImageButton>(idR1) topBtn1.tag = R.drawable.top_btn1_default_drawable val bottomBtn = findViewById<ImageButton>(idR5_oppCiv) topBtn1.setOnClickListener { clickedBtn -> // 从tag中取出资源ID并设置给底部按钮 val resId = clickedBtn.tag as Int bottomBtn.setImageResource(resId) }
注意:若顶部按钮图片动态更新,需同步更新tag的值,确保获取到最新资源ID。
额外优化建议
- 提前缓存所有需要操作的View实例,避免在点击事件中重复调用
findViewById,提升性能。 - 多个顶部按钮可统一设置点击事件,减少重复代码:
val bottomBtn = findViewById<ImageButton>(idR5_oppCiv) val topButtons = listOf( findViewById<ImageButton>(idR1), findViewById<ImageButton>(idR2), findViewById<ImageButton>(idR3) ) topButtons.forEach { btn -> btn.setOnClickListener { clickedBtn -> val currentDrawable = (clickedBtn as ImageButton).drawable.mutate() bottomBtn.setImageDrawable(currentDrawable) } }
内容的提问来源于stack exchange,提问作者SL5net
相关产品推荐
相关产品推荐

