Kotlin动态创建的ImageView删除图片方法 解决旧图残留问题
问题根因
- 每次调用
showDecision时都会新创建一个ImageView实例,通过addView添加到decisionLayout后,旧的ImageView并没有被移除,即使将布局设为GONE也只是隐藏了整个布局,布局内的多份重叠ImageView依然存在,下次显示时就会出现旧图残留 setBackgroundResource(0)无效是因为你通过setImageResource设置的是ImageView的src前景资源,修改background背景不会对前景展示产生影响
解决方案
方案1(推荐):复用唯一ImageView
不要每次调用方法都新建View,将ImageView设为类成员变量,提前初始化后仅替换图片资源即可:
- 在Activity/Fragment类中声明成员变量
// 类全局成员 private lateinit var decisionView: ImageView private var decisionLayout: RelativeLayout? = null private var decisionShown = false
- 在
onCreate中提前初始化View,仅添加一次到布局
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化布局和ImageView,只执行一次 decisionLayout = findViewById(R.id.decision_layout) decisionView = ImageView(this) decisionView.layoutParams = RelativeLayout.LayoutParams(392, 700) // 等hut、aDecision初始化完成后再设置坐标即可 decisionView.x = hut.x - 80 decisionView.y = aDecision.y decisionLayout?.addView(decisionView) // 初始状态隐藏 decisionLayout?.visibility = View.GONE }
- 简化
showDecision逻辑,仅替换图片资源
private fun showDecision(warning: String) { val resId = when (warning) { "wrong" -> R.drawable.wrong "notGood" -> R.drawable.notGood "bad" -> R.drawable.bad else -> 0 // 可补充默认资源避免异常 } decisionView.setImageResource(resId) decisionLayout?.visibility = View.VISIBLE decisionShown = true }
原有点击隐藏的逻辑可以直接正常使用,因为布局内永远只有一个ImageView,不会出现重叠。
方案2(轻量修改):添加新View前清空旧布局
如果不想调整现有代码结构,只需要在addView前调用removeAllViews清空布局内所有旧View即可:
// Add ImageView to linearLayout decisionLayout?.removeAllViews() // 新增这行,清空之前添加的所有旧图片 decisionLayout?.addView(decisionView) decisionLayout?.visibility = View.VISIBLE decisionShown = true
该方案修改成本低,但每次都会新建销毁View,适合调用频率较低的场景。
内容的提问来源于stack exchange,提问作者LastCard1440
相关产品推荐
相关产品推荐

