Android 官方提供了三个用来优化布局的标签,分别是include、merge与ViewStub标签。

include布局重用

app开发过程中,会遇到不同页面里有相同的布局,这时我们可以将这些通用的布局提取出来到一个单独的layout文件里,再使用<include>标签引入到相应的页面布局文件里,主要通过includelayout属性引用。

<include> 标签允许你在一个布局文件中重用另一个布局文件的内容。它可以将另一个布局文件的内容嵌入到当前布局中,类似于在代码中使用一个自定义视图。这对于在多个布局中使用相同的视图非常有用,以避免冗余的布局代码。使用 <include> 标签,你可以将重复的布局提取到一个单独的文件中,并在需要时在其他布局中引用它。

例如,假设你有一个名为 header_layout.xml 的布局文件,它定义了应用程序中的顶部导航栏。你可以在其他布局文件中使用 <include> 标签将 header_layout.xml 包含进来,以便在多个屏幕中共享相同的导航栏。

<include
    layout="@layout/header_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

merge减少视图层级

merge标签可用于减少视图层级来优化布局,可以配合include使用,如果include标签的父布局 和 include布局的根容器是相同类型的,那么根容器的可以使用merge代替。

<merge> 标签用于优化布局层次结构。当你使用 <include> 标签将一个布局文件包含在另一个布局文件中时,会导致多余的层级嵌套。为了避免这种情况,你可以在被包含的布局文件的根元素中使用 <merge> 标签。这样,被包含的布局文件将不会创建一个额外的层级嵌套,而是直接将其子视图添加到包含它的布局中。

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 子视图元素 -->
</merge>

使用 <merge> 标签后,你无需再在被包含的布局文件中添加根元素,而只需在 <include> 标签中指定被包含布局文件的名称即可。

ViewStub按需加载

按需加载 顾名思义需要的时候再去加载,不需要的时候可以不用加载,节约内存使用。通常情况我们会使用setVisibility方法来控制视图的显示和隐藏,但是这种情况视图已经加载了。
比如app中页面里某个布局只需要在特定的情况下才显示,其余情况下可以不用加载显示,这时候可以使用ViewStub

<ViewStub> 标签用于在布局中延迟加载视图。它提供了一种方式,在运行时根据需要动态加载布局文件,而不是一开始就将其全部加载到内存中。这在需要根据某些条件决定是否加载视图时非常有用,可以提高性能和内存效率。

在布局中使用 <ViewStub> 标签时,你需要指定一个布局文件作为视图的占位符。当需要加载该视图时,可以通过调用 <ViewStub> 的 inflate() 方法来实现。

<ViewStub
    android:id="@+id/my_view_stub"
    android:layout="@layout/my_view_placeholder"
    android:layout_width

总结

  1. 使用include标签可以增加布局的复用性,提高效率。
  2. 使用merge标签可以减少视图树中的节点个数,加快视图的绘制,提高UI性能。
  3. merge标签的使用,看上去一次只减少一个节点,但是当一个布局嵌套很复杂的时候,节点的个数可能达到几百个,这个时候,如果每个地方都多一个节点,视图的绘制时间相应的也就变长了很多。
  4. UI性能的优化还有另外一个比较重要的知识点ViewStub,它是一个View,但是它几乎不占用资源,使用ViewStub能够加快视图的绘制,提高性能。

相关参考
https://zhuanlan.zhihu.com/p/38439099