Fragment中多次调用onCreatView()导致异常问题的解析

在项目开发过程中,通常都少不了Fragment的使用。
今天遇到一个问题,在一个activity中,使用多个Fragment,做FragmentTabHost的切换;Fragment第一次调用的时候没有问题。当从一个Fragment切换回之前调用过的Fragment的时候,出现FC。
报错:java.lang.IllegalStateException: The specified child already has a parent。You must call removeView() on the child’s parent first。
旧代码写法如下:

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        if(null == layout){
            layout = inflater.inflate(R.layout.xx, container, false);
            initUI();
            initData();
        }

        return layout;
}

以前都是这么写的,都没有报错。这段代码之前是以兼容eclipse版本的模式写的,现在改成纯studio的目录格式,报了这个错。不知道具体的原因是什么。

解决:
既然出现错误了,就好好解决吧(有问题才有进步不是)。

从错误提示中可以看到,是非法状态异常,因为我们的view已经有一个父控件了,在重新切换进入该Fragment的时候要先在父控件中移除现有的child view。

所以对上述代码进行修改,获取我们view的父控件,判空,在非空的情况下,remove。
clean项目,重新rebuild,run…
再次切换,问题解决了。

 @Override
 public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        if (null == layout) {
            layout = inflater.inflate(R.layout.fragment_home, container, false);
            initUI();
            initData();
        }

        ViewGroup parent = (ViewGroup) layout.getParent();
        if (null != parent){
            parent.removeAllViews();
        }

        return layout;
    }

以上是解决的方案,但是具体的原因还没有分析透彻,各路大神有对其中机制比较清楚的,可以留言交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值