1. Include

include 可以复用组件

普通用法

Test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/include_ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/include_button"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Activity_main.xml

<include layout="@layout/test" />

MainActivity.java

button = findViewById(R.id.include_button);

可以根据原文件 id 获取, 当原文件 id 与此文件 id 重复的时候,会取最先出现的,所以 id 不要重复

控制大小

<include
    layout="@layout/test"
    android:layout_width="100dp"
    android:layout_height="50dp" />

可以设置 id

<include
    android:id="@+id/include_ll"
    layout="@layout/test"
    android:layout_width="100dp"
    android:layout_height="50dp" />

include 设置 id 时会替换原根标签 id, 则原根标签 id 则获取不到值

一个界面 include 两个相同的文件怎么区分

<include
    android:id="@+id/include_ll1"
    layout="@layout/test" />

<include
    android:id="@+id/include_ll2"
    layout="@layout/test" />
ll1 = findViewById(R.id.include_ll1);
ll2 = findViewById(R.id.include_ll2);

button1 = ll1.findViewById(R.id.include_button);
button2 = ll2.findViewById(R.id.include_button);

2. merge

参考文献:

Android 布局优化(merge使用)
Android 布局 Merge的使用

merge 标签是用来帮助在视图树中减少重复布局的,当一个 layout include 另外一个 layout 时。

不使用 merge 时

Layout1.xml

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

Layout2.xml

<FrameLayout>
   <TextView />
</FrameLayout>

实际结果

<FrameLayout>
   <FrameLayout>
      <TextView />
   </FrameLayout>
</FrameLayout>

使用 merge

Layout1.xml

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

Layout2.xml

<merge>
   <TextView />
</merge>

实际结果

<FrameLayout>
   <TextView />
</FrameLayout>
  • merge 必须放在布局文件的根节点上。
  • merge 并不是一个 ViewGroup,也不是一个 View,它相当于声明了一些视图,等待被添加。
  • merge 标签被添加到 A 容器下,那么 merge 下的所有视图将被添加到 A 容器下。
  • 因为 merge 标签并不是 View,所以在通过 LayoutInflate.inflate 方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为 true,也就是必须为 merge 下的视图指定一个父亲节点。
  • 因为 merge 不是 View,所以对 merge 标签设置的所有属性都是无效的。

merge 视图在 AS 中无法预览怎么办?

使用 parentTag 指定被装在的 parent 的布局容器类型,例如 tools:parentTag="android.widget.FrameLayout",那么就可以预览到当前布局被装在进 FrameLayout 时候的效果