在项目开发过程中,通常都少不了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;
}
以上是解决的方案,但是具体的原因还没有分析透彻,各路大神有对其中机制比较清楚的,可以留言交流。