点击ImageView切换Drawable异常:仅执行else分支求排查
解决ImageView点击切换图片失效的问题
你遇到的问题根源在于直接对比Drawable的constantState不可靠:==是对象引用对比,而每次调用ContextCompat.getDrawable()或resources.getDrawable()时,系统可能生成新的Drawable实例,它们的constantState引用并不相同,导致if分支的判断条件永远不成立,只会重复执行else逻辑。
最可靠的解决方案:用状态变量跟踪切换状态
定义一个布尔变量记录当前书签状态,完全避开Drawable对象对比的问题:
// 根据ImageView默认显示的图片设置初始值,比如默认显示边框就设为false private var isBookmarked = false bookmark_site.setOnClickListener { vibrator.vibrate(50) // 切换状态 isBookmarked = !isBookmarked if (isBookmarked) { bookmark_site.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_baseline_bookmark_filled_24)) } else { bookmark_site.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_outline_bookmark_border_outline_24)) } }
补充说明
- 统一使用
ContextCompat.getDrawable()加载Drawable,它会自动适配不同Android版本和主题配置,比直接调用resources.getDrawable()更稳妥。 - 如果一定要通过Drawable关联状态(不推荐),可以给ImageView设置
tag记录当前资源ID:
// 初始设置图片时绑定tag bookmark_site.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_outline_bookmark_border_outline_24)) bookmark_site.tag = R.drawable.ic_outline_bookmark_border_outline_24 bookmark_site.setOnClickListener { vibrator.vibrate(50) val currentResId = bookmark_site.tag as Int if (currentResId == R.drawable.ic_baseline_bookmark_filled_24) { bookmark_site.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_outline_bookmark_border_outline_24)) bookmark_site.tag = R.drawable.ic_outline_bookmark_border_outline_24 } else { bookmark_site.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_baseline_bookmark_filled_24)) bookmark_site.tag = R.drawable.ic_baseline_bookmark_filled_24 } }
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

