无法移除已添加的ConsumeFragment?求正确实现方式
解决Fragment无法移除的问题
你的问题出在移除Fragment时创建了一个全新的ConsumeFragment实例,这个实例从来没被添加到FragmentManager中,所以系统找不到要移除的目标Fragment,自然无法生效。
下面是几种正确的移除方式:
方法1:保存Fragment实例引用
添加Fragment时就把实例存下来,移除时直接使用这个引用:
// 在类中声明变量保存实例 private var consumeFragment: ConsumeFragment? = null // 添加Fragment的代码 consumeFragment = ConsumeFragment.newInstance(consumerTitle) supportFragmentManager.beginTransaction() .replace(R.id.fragment2, consumeFragment!!) .commit() // 移除按钮点击事件 binding.killConsumeBut.setOnClickListener { Log.d("XXX", "click KillConsumerButton") consumeFragment?.let { supportFragmentManager.beginTransaction().remove(it).commit() consumeFragment = null // 移除后清空引用,防止内存泄漏 } }
方法2:通过Tag标记并查找Fragment
添加Fragment时指定一个唯一Tag,移除时通过Tag找到对应实例:
// 添加Fragment时设置Tag supportFragmentManager.beginTransaction() .replace(R.id.fragment2, ConsumeFragment.newInstance(consumerTitle), "CONSUME_FRAG") .commit() // 移除按钮点击事件 binding.killConsumeBut.setOnClickListener { Log.d("XXX", "click KillConsumerButton") val targetFragment = supportFragmentManager.findFragmentByTag("CONSUME_FRAG") targetFragment?.let { supportFragmentManager.beginTransaction().remove(it).commit() } }
方法3:通过容器ID查找Fragment
因为你是把Fragment替换到R.id.fragment2容器中,可以直接通过容器ID找到当前显示的Fragment:
binding.killConsumeBut.setOnClickListener { Log.d("XXX", "click KillConsumerButton") val targetFragment = supportFragmentManager.findFragmentById(R.id.fragment2) // 可以判断类型,避免误删其他Fragment if (targetFragment is ConsumeFragment) { supportFragmentManager.beginTransaction().remove(targetFragment).commit() } }
内容的提问来源于stack exchange,提问作者user19862929
相关产品推荐
相关产品推荐

