44

如果我使用merge标签作为片段布局的父标签,我会遇到两个问题:

  • 首先,在 中onCreateView(),如果我指定不附加到 root,我会收到错误:

    android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

  • 如果我确实附加到根目录,我会收到错误消息:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我在这里找到了另一个问题的好答案,说片段库会自动将子视图附加到您在替换中指定的父视图组。建议是您需要因此设置attachToRootfalse. 对于merge标签,它是必需的。

是否可以绕过这些规则中的任何一个来将merge标签用于片段的布局?

4

1 回答 1

48

是否可以绕过这些规则中的任何一个来将合并标签用于片段的布局?

不,正如你已经看到的,当你对一个以merge标签为根的布局文件进行膨胀时,你必须将它附加到一个有效的 parent ViewGroup。将其附加到容器中onCreateView是不正确的,因为View该方法返回的将由框架添加。

您始终可以在onCreateView附加膨胀布局的方法中创建一个包装器布局(并返回此包装器布局),但这将使merge标签优化无用,因为您可以从一开始就在 xml 布局文件中添加包装器布局:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     LinearLayout wrapper = new LinearLayout(getActivity()); // for example
     inflater.inflate(R.layout.layout_with_merge_as_root, wrapper, true);
     return wrapper;
}
于 2012-11-12T20:53:52.343 回答