ViewPager Fragment You must removeView

本文探讨了在使用ViewPager和FragmentPagerAdapter时遇到的闪退问题,并提供了有效的解决方案。通过正确处理视图的移除和初始化过程,避免了数据重叠和空白界面的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在开发中,使用了ViewPager + FragmentPagerAdapter + 添加Fragment的方式,
在Fragment点击到其它页面又返回时,总是闪退报错,提示 已经有一个child被添加进来了,必须先RemoveView。

因为我在Fragment里使用了 lastView来保存之前的view, 所以会报这个错误。

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        if(lastView!=null){
            binding = FragmentTabTextFragmemntBinding.inflate(inflater, container, false)
            lastView = binding.root
        }
      return lastView 
    }

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if(!isViewInited){
            isViewInited = true
            setInfo()
        }
    }

我原本想使用这种方式解决重新绘制Fragment的问题,没想到报 removeView 的错误。
而去掉 lastViewisViewInited 判断,页面上又会保留上一个view的数据,在滑动时可以看到有两层数据重叠了。

解决

想到的解决方案就是 用 lastView 判断上一个view是否为空,如果不为空,就removeView, 把isViewInited的判断去掉。这样就不会有数据重叠和报错了。

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        if(lastView!=null){
            container?.removeAllViews()
        }
        binding = FragmentTabTextFragmemntBinding.inflate(inflater, container, false)
        lastView = binding.root
        return binding.root
    }
    
 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setInfo()
    }

问题

viewpager滑动时数据消失,界面变成空白

解决

// 有多少个页面就设为多少个
  tabPager.offscreenPageLimit = fragments.size

问题

fragment内的fragment viewpager,
childFragmentManager

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值