Android开发中如何获取ImageButton当前显示图片的资源ID?
问题核心原因
ImageButton 本身不会保存你通过setImageResource()传入的资源ID,你没法直接从控件属性里拿到当前显示图片对应的res ID。直接调用getDrawable()拿到的是系统实例化后的Drawable对象,没有携带原始资源ID信息,强行比对Drawable对象会存在不同系统版本兼容性差、判断失效的问题,不要用这种方式实现。
推荐实现方案
最稳妥的思路是自己维护图片对应的状态,不要反向从控件读取资源信息,有两种常用实现方式:
方案1:利用View的Tag存储当前资源ID(轻量无额外变量)
View自带的tag属性可以用来存任意关联对象,你每次给ImageButton设置图片的时候,同步把对应的资源ID存在tag里,点击的时候直接读tag判断即可。
- 初始化控件时同步设置tag:
// Java 示例 ImageButton imageButton1 = findViewById(R.id.ib_1); imageButton1.setImageResource(R.drawable.img1); imageButton1.setTag(R.drawable.img1); // 存当前资源ID到tag
// Kotlin 示例 val imageButton1 = findViewById<ImageButton>(R.id.ib_1) imageButton1.setImageResource(R.drawable.img1) imageButton1.tag = R.drawable.img1
- 点击事件中读取tag判断逻辑:
// Java 点击事件示例 imageButton1.setOnClickListener(v -> { Object tagObj = v.getTag(); if (!(tagObj instanceof Integer)) return; int currentResId = (int) tagObj; if (currentResId == R.drawable.img1) { // 切换图片 v.setImageResource(R.drawable.img2); v.setTag(R.drawable.img2); // 记得更新tag // 联动修改其他控件 ImageButton imageButton2 = findViewById(R.id.ib_2); imageButton2.setImageResource(R.drawable.img3); imageButton2.setTag(R.drawable.img3); } });
// Kotlin 点击事件示例 imageButton1.setOnClickListener { v -> val currentResId = v.tag as? Int ?: return@setOnClickListener when (currentResId) { R.drawable.img1 -> { v.setImageResource(R.drawable.img2) v.tag = R.drawable.img2 // 联动修改其他控件 imageButton2.setImageResource(R.drawable.img3) imageButton2.tag = R.drawable.img3 } R.drawable.img2 -> { v.setImageResource(R.drawable.img1) v.tag = R.drawable.img1 } } }
方案2:单独维护状态变量(适合固定状态切换场景)
如果你的图片切换逻辑是固定的几类状态(比如两态开关、三档切换),完全不需要存资源ID,单独定义状态变量即可,逻辑更清晰:
// 比如两态切换场景,定义布尔值标记当前状态 private var isImg1Selected = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_layout) val imageButton1 = findViewById<ImageButton>(R.id.ib_1) // 初始化默认状态 imageButton1.setImageResource(R.drawable.img1) imageButton1.setOnClickListener { isImg1Selected = !isImg1Selected if (isImg1Selected) { it.setImageResource(R.drawable.img1) imageButton2.setImageResource(R.drawable.img3) } else { it.setImageResource(R.drawable.img2) imageButton2.setImageResource(R.drawable.img4) } } }
不推荐的做法
不要尝试通过getDrawable()获取Drawable对象后比对ConstantState来判断资源,这种方式在不同Android版本、不同图片来源(比如用图片加载库加载的图、shape/xml资源)下表现不一致,很容易出现判断失效的问题,后期维护成本极高。
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

