我是如何阻止使用LayoutInflater()抛出IllegalStateExceptions的?inflate(int resource,ViewGroup root,boolean attachToRoot)?

时间:2014-05-26 22:46:21

标签: java android android-fragments layout-inflater illegalstateexception

我最近在设置包含3个片段的viewpager时遇到了一个问题。当应用程序运行时,它崩溃了

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first

以下是用于创建要传递给pageAdapter的片段列表列表的代码。

private Vector<Fragment> getFragments() {
    Vector<Fragment> list = new Vector<Fragment>();

    list.add(new Fragment1());
    list.add(new Fragment2());
    list.add(new Fragment3());

    return list;

除了使用不同布局创建的片段之外,每个片段基本相同。这是我对其中一个片段的原始代码。 公共类Fragment1扩展了Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.fragment1, container);
    return v;
}
} 

但是当我像这样运行它时,它一直与IllegalStateException崩溃。我发现问题来自于正在创建的片段。经过一些谷歌搜索后,我尝试将片段的代码更改为此。

公共类Fragment1扩展了Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.fragment1, container, false);

    return v;
}
}

这解决了这个问题,我不再有IllegalStateException,除了我不知道这是如何工作的。这个布尔究竟做了什么?这个例外是什么意思?我曾尝试添加方法调用,就像它已经说好了但是没有解决它。此外,我尝试将此布尔值更改为true,我再次得到相同的错误。 Android文档说它的attachToRoot但不是我想要做的吗?将我的3个片段附加到rootview,这是viewpager?如果有人能够解释这一点,将不胜感激。

1 个答案:

答案 0 :(得分:6)

3-arg版本LayoutInflater.inflate()的布尔参数确定LayoutInflater是否会将膨胀的视图添加到指定的容器中。对于片段,您应指定false,因为片段本身会将返回的视图添加到容器中。如果您传递true或使用2-arg方法,则LayoutInflater会将视图添加到容器中,然后片段将在稍后再次尝试执行此操作,从而生成IllegalStateException