如果我使用merge
标记作为我片段布局的父标记,我会遇到两个问题:
首先,在onCreateView()
中,如果我指定NOT不附加到root,我会收到错误:
android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
如果我附加到root,我会收到错误:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我在这里找到了另一个问题的一个很好的答案,说片段库会自动将子项附加到您在replace中指定的父视图组。建议您需要将attachToRoot
设置为false
。对于merge
标记,它是必需的。
是否可以绕过这些规则中的任何一个来使用merge
标记来处理片段的布局?
答案 0 :(得分:43)
是否可以绕过这些规则中的任何一个来使用合并 片段布局的标签?
没有。如您所见,当您将merge
标记作为其根目录的布局文件膨胀时,必须将其附加到有效的父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;
}