我在运行时从活动中膨胀片段。因此,为了在片段类中扩展片段的视图,我调用了:
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
return inflater.inflate(R.layout.confirm_fragment, container);
}
此刻我的日志崩溃了:
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
但是如果我将我的方法修改为:
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
return inflater.inflate(R.layout.confirm_fragment, null);
}
我现在将我的容器指定为null
,它可以正常工作。但我不明白的是,我在哪里为代码中的视图指定了父级崩溃?
答案 0 :(得分:1)
我在哪里指定了视图[...]的父级?
您可以通过以下方式动态添加Fragment
:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(android.R.id.content, myFragment, FRAGMENT_TAG)
.addToBackStack(null)
.commit();
在add()
中,您可以通过传递所需容器的ID来指定Fragment
应显示的位置(在本例中为全屏)。
另请参阅参考文献developers.android.com中的方法说明:
containerViewId int:要放置此片段的容器的可选标识符。如果为0,则不会将其放在容器中。
我没有向UI添加Fragment
(例如,您需要将其作为保留片段用于缓存),onCreateView()
将永远不会被调用。
因此,调用onCreateView()
后,此Fragment
的父级已经存在 - FragmentManager
为您设置了它。
答案 1 :(得分:1)
从this link读取为什么以及何时传递父容器的实例或在attachToRoot
param中为null。
来自链接:
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
通过传入false,我们说我们不想将View附加到根目录 ViewGroup还没有。我们说它会发生在其他一些人身上 时间点。在这个例子中,另一个时间点就是 在通货膨胀之后立即使用addView()方法。
所以,如果你膨胀:
return inflater.inflate(R.layout.confirm_fragment, container);
首先,它会立即将confirm_fragment
附加到容器中。返回视图后,将尝试隐式地将片段添加到父级,但由于已经添加了片段,因此将抛出异常:
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
希望你明白这一点。
答案 2 :(得分:0)
您需要将attachToParent
设为false
例如:
inflater.inflate(R.layout.confirm_fragment, container,false);
答案 3 :(得分:0)
尝试使用以下代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.confirm_fragment, container, false);
return view;
}