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

Kotlin中如何获取ImageButton图片资源并设置给其他ImageButton

如何获取ImageButton当前图片资源并设置给另一个ImageButton?

问题背景

需求:将顶部被点击的ImageButton的当前图片资源,设置给底部的ImageButton。
动机:底部ImageButton作为顶部ImageButton最后一次点击的记录/备份。
应用设置:

  • 顶部包含多个ImageButton
  • 底部有一个单独的ImageButton

常见错误示例及原因

  1. 硬编码资源ID(无报错但未实现需求)
findViewById<ImageButton>(idR1).setOnClickListener {
    findViewById<ImageButton>(idR5_oppCiv).setImageResource(R.drawable.athen_cavalry_swordsman);
}

直接写死目标图片资源,未获取点击按钮的当前图片,完全不符合需求。

  1. 错误的资源调用方式(无法运行)
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()方法,会导致编译或运行报错。

  1. 错误的资源标识符获取(点击崩溃)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:15:27