我正在尝试将两个片段添加到以下布局:
dialog_empty_linear_layout.xml:
<LinearLayout
android:id="@+id/ParentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
使用以下代码:
setContentView(R.layout.dialog_empty_linear_layout);
int parentViewId = getIntent().getIntExtra(PARENT_VIEW_ID, -1); // == R.id.ParentLayout
if (parentViewId == -1)
parentViewId = android.R.id.content;
/*
* Extracting Fragments types
*/
Class<? extends Fragment>[] fragmentTypes = getFragments(); // there are two fragments here!
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
for (Class<? extends Fragment> fragmentType : fragmentTypes) {
Fragment fragment = Tools.createNewInstance(fragmentType);
ft.add(parentViewId, fragment);
}
ft.commitAllowingStateLoss();
在执行代码时,我收到以下错误:
引起:java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。
我很惊讶,因为这是一个新创建的 Activity,有一个新创建的片段和新创建的视图......
所以我跟踪了堆栈跟踪并检查了我们在谈论哪个孩子和哪个父母,因为异常没有提供任何额外的信息......
我更惊讶地发现 Child 是 LinearLayout(例如 R.ParentLayout),而 Parent 是包装它的 RelativeLayout。
也许我又一次错过了显而易见的事情,但我认为:
ft.add(parentViewId, fragment);
假设将 Fragment 添加到 parentViewId 布局,而不是尝试将 parentViewId 布局添加到其父布局...
另外,如果我使用以下 XML,一切正常:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ParentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
有什么见解吗?