<include>和<merge>非嵌套关系,<merge>只能作被<include>引用布局的根节点,不可置于<include>内部;前者复用布局,后者消除冗余父容器以优化层级。

Android 的 <include> 和 <merge> 标签不是嵌套关系,<merge> 不能写在 <include> 里面,所以 <include><merge>...</merge></include> 是非法写法,会编译报错。
include 用于复用布局
<include> 是一个占位标签,用来把另一个 XML 布局文件“插入”到当前布局中。它本身不生成 View,但会把目标布局的根节点(及其子树)原样展开进来。
常见写法:
- 在主布局里写:
<include layout="@layout/item_header" /> - 支持覆盖属性,比如:
<include layout="@layout/item_header" android:layout_width="match_parent" />(会覆盖被 include 布局根节点的宽高)
merge 用于消除冗余父容器
<merge> 只能作为 XML 文件的**根节点**使用,作用是告诉系统:这个布局没有自己的 ViewGroup 容器,里面的子 View 应该直接添加到父布局中 —— 从而避免多一层无意义的嵌套。
典型场景:你写了一个头部布局 item_header.xml,但它只是几行 TextView,不需要额外的 LinearLayout 包裹。这时就该用 <merge> 作根:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/title" ... />
<TextView android:id="@+id/subtitle" ... />
</merge>
这样被 <include> 引入时,两个 TextView 就会直接加到父布局里,不会多出一个 <merge> 节点(它本身不生成 View)。
二者配合的关键:merge 必须是被 include 的那个布局的根
也就是说:<include> 指向的 XML 文件,其根节点可以是 <merge>,但 <include> 标签自身永远不能包裹 <merge>。
正确组合流程:
- 新建
header_merged.xml,根为<merge>,内部放实际控件 - 在
activity_main.xml中用<include layout="@layout/header_merged" /> - 运行时,
<merge>被“展开”,子 View 直接成为activity_main根布局的子项
注意事项
用 <merge> 时有几点必须遵守:
-
<merge>只能作为根节点,不能出现在中间层级 - 被
<include>的布局若以<merge>为根,则无法在 Layout Editor 中预览(因为缺了实际父容器),但运行时完全正常 - 如果被 include 的布局根是
<merge>,那么你在<include>标签里设置的宽高、margin 等属性,会直接应用到它的第一个子 View 上(而不是忽略)
基本上就这些。用好 merge + include,能有效减少布局层级,提升渲染性能,尤其在列表 item 或复杂复用模块中很实用。










