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

点击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))
    }
}

补充说明

  1. 统一使用ContextCompat.getDrawable()加载Drawable,它会自动适配不同Android版本和主题配置,比直接调用resources.getDrawable()更稳妥。
  2. 如果一定要通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:10:34