我最近在设置包含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?如果有人能够解释这一点,将不胜感激。
答案 0 :(得分:6)
3-arg版本LayoutInflater.inflate()
的布尔参数确定LayoutInflater
是否会将膨胀的视图添加到指定的容器中。对于片段,您应指定false
,因为片段本身会将返回的视图添加到容器中。如果您传递true
或使用2-arg方法,则LayoutInflater会将视图添加到容器中,然后片段将在稍后再次尝试执行此操作,从而生成IllegalStateException
。