片段 - 获取视图在调用onCreateView时已经存在父错误

时间:2016-09-15 05:10:14

标签: android android-fragments android-view

我在运行时从活动中膨胀片段。因此,为了在片段类中扩展片段的视图,我调用了:

  @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,它可以正常工作。但我不明白的是,我在哪里为代码中的视图指定了父级崩溃?

4 个答案:

答案 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;
}