0

我正在尝试将两个片段添加到以下布局:

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>

有什么见解吗?

4

1 回答 1

0

嗯,这很有趣......对于那些遇到这个的人来说......注意这非常愚蠢!

在 Fragment 中重写此方法:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_id, container);
}

这是愚蠢的事情......

inflater.inflate 有另一个重载:

    return inflater.inflate(R.layout.fragment_id, container, **addToRoot**);

出于某种原因,我希望将片段布局添加到容器中(不要相信直觉),而不是将容器添加到 rootView。直到今天,我一直将我所有的 Fragments 添加到我的根视图中,(container == rootView) 所以这个问题没有发生,但是一旦容器不是 rootView,我必须明确声明 addToRoot=false,例如

    return inflater.inflate(R.layout.fragment_id, container, false);

好吧,那就是那些家伙......布尔值的愚蠢!

于 2013-10-27T13:37:48.010 回答