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

来源:互联网 发布:网络黑白 百度文学 编辑:程序博客网 时间:2024/05/16 08:47

在项目开发过程中,通常都少不了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
原创粉丝点击