[TOC]

# 布局优化

布局优化的思想很简单,就是尽量减少布局文件的层级。主要从以下几个方面入手:

* 善于重用布局文件

* 使用ViewStub仅在需要时才加载

* 删除无用的控件和布局

* 使用性能较好的ViewGroup

## 重用布局文件

### \标签

\标签可以允许在一个布局当中引入另外一个布局,那么比如说我们程序的所有界面都有一个公共的部分,这个时候最好的做法就是将这个公共的部分提取到一个独立的布局文件当中,然后在每个界面的布局文件当中来引用这个公共的布局。

```xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

layout="@layout/titlebar" />

......

```

其中,在\标签当中,我们是可以覆写所有layout属性的,即include中指定的layout属性将会覆盖掉titlebar中指定的layout属性。

我们可以覆写titlebar中的任何一个layout属性,如layout_gravity、layout_margin等,而非layout属性则无法在\标签当中进行覆写。需要注意的是,如果想要在\标签当中覆写layout属性,必须要将layout_width和layout_height这两个属性也进行覆写,否则覆写效果将不会生效。

### \标签

\标签是作为\标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。

比如说我们需要编写一个确定取消按钮的公共布局,这样任何一个界面需要确定和取消功能时就不用再单独编写了,新建ok\_cancel\_layout.xml,代码如下所示:

```xml

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical" >

android:id="@+id/ok"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:text="OK" />

android:id="@+id/cancel"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:layout_marginTop="10dp"

android:text="Cancel" />

```

但是把这个布局文件通过\标签引入时,会造成布局嵌套,也就是又多了一层LinearLayout。布局层次如下:

![](https://img.kancloud.cn/a6/ed/a6ede73d13ac679be1b6d38d1683aca7_545x146.png)

使用\标签可以解决这个问题:

```xml

android:id="@+id/ok"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:text="OK" />

android:id="@+id/cancel"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:layout_marginTop="10dp"

android:text="Cancel" />

```

此时布局层次如下:

![](https://img.kancloud.cn/a8/17/a8173fd5339d082004061db150a5720a_507x140.png)

## ViewStub仅在需要时才加载

有的时候我们会遇到这样的场景,就是某个布局当中的元素非常多,但并不是所有元素都一起显示出来的,而是普通情况下只显示部分常用的元素,而那些不常用的元素只有在用户进行特定操作的情况下才会显示出来。

Android为此提供了一种非常轻量级的控件:ViewStub。ViewStub虽说也是View的一种,但是它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,将它放置在布局当中基本可以认为是完全不会影响性能的。

ViewStub 的使用很简单,在布局文件中像引入其他控件一样引入 ViewStub:

```xml

android:inflatedId="@+id/subTree"

android:layout="@layout/mySubTree"

android:layout_width="120dip"

android:layout_height="40dip" />

```

需要展示 ViewStub 所引用的视图时,通过 id 获取到 ViewStub:

```java

ViewStub stub = (ViewStub) findViewById(R.id.stub);

View inflated = stub.inflate();

// stub.setVisibility(View.VISIBLE);

```

除了调用 inflate 方法,还可以调用 setVisible 方法来展示 ViewStub 所引用的 View。

关于ViewStub的使用,可以参考[ViewStub源码分析](http://wiki.xuchongyang.com/1262571)

## 使用性能较好的ViewGroup

* 删除无用的控件和层级

* 不需要嵌套时优先使用LinearLayout和FrameLayout,需要嵌套或者复杂布局时使用ConstraintLayout代替RelativeLayout

* LinearLayout、RelativeLayout、FrameLayout、ConstraintLayout几种布局的区别

* RelativeLayout 子 View 的排列方式是基于彼此的依赖关系,所以在测量时会在横向和纵向上分别测量一次

* LinearLayout 为线性排列,在没有设置 weight 属性时只测量一次,设置了 weight 属性也是测量两次

* FrameLayout会默认把所有控件摆放在布局的左上角,并覆盖在前一控件的上层,当然可以通过 layout\_gravity 属性来指定对齐方式

* ConstraintLayout 使用约束的方式来指定各个控件的位置和关系,View 的位置受到三类约束:其他 View、父容器、基准线,并且支持设置比例。可以使布局完全扁平化,性能更高

# 参考

《Android开发艺术探索》任玉刚 著

android 重用布局区分控件,【专题分析】布局优化相关推荐

  1. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  2. Android中列表框纵向布局,andriod布局常用控件属性..docx

    andriod布局常用控件属性. android:gravity="center_vertical" ?限定它里面的内容要垂直居中显示.?android:layout_gravit ...

  3. Android 通过代码改变控件的布局方式

    在很多情况下当我们在xml中布局的方式并不能满足我们的要求,而这时我们就需要通过在代码中控制控件的布局 根据不同的条件来控制布局.首先来了解一下安卓中的一些单位 dip: device indepen ...

  4. Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

    RelativeLayout中子控件常用属性: 子控件默认是从父控件的左上角开始排列的 相对于父控件 android:layout_alignParentTop="true" 和父 ...

  5. android线程改变布局,Android线程中设置控件的值提示报错的解决方法

    本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.y ...

  6. Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)

    工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...

  7. android中倒计时控件CountDownTimer分析

    android中倒计时控件CountDownTimer分析1 示例代码 new CountDownTimer(10000, 1000) {public void onTick(long millisU ...

  8. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  9. android线性布局设置控件固定在底部,Android UI组件LinearLayout线性布局详解

    LinearLayout 线性布局,该布局的继承关系: 1. 什么是线性布局 通俗的说感觉起来和线有关,参照线的特点,有么是横向的,要么是竖向的. LinearLayout是线性布局控件,它包含的子控 ...

最新文章

  1. pandas将dataframe数据列中的年、月、日列组合成单一的日期数据列实战
  2. C#类在初始化时的执行顺序
  3. [推荐]国外的Windows Mobile资源站点
  4. vim 怎么显示空格_vim 修改tab为四个空格
  5. 互联网公司忽悠员工的黑话
  6. 只读副本和Spring Data第3部分:配置两个实体管理器
  7. idea如何安装scala插件
  8. tigerVNC的简单使用教程(CentOS 自带VNC包的远程桌面连接)
  9. Android中监听ScrollView滑动停止和滑动到底部
  10. 理解和使用 Unity UI 系统(canvas和CanvasScaler )
  11. P2P终结者的工作原理
  12. 大一高等数学期末考试试卷及答案详解
  13. 二级java考什么_​Java计算机二级考试考什么
  14. 程序员「在知乎装逼被怼」,决定用『面试』证明自己
  15. linux中下载python_linux下python安装
  16. 你有想过如何合适地给 JavaScript 变量命名吗?
  17. 罗马帝国 Ancient Rome 简易修改器
  18. 将US7ASCII 字符集的数据转到ZHS16GBK 字符集数据库
  19. mapbox-gl开发:带高度的标签
  20. 微信小程序开发13 云开发:云原生一体化应用开发平台

热门文章

  1. linux下搭建DNS子域及相关授权详解
  2. 偶然遇到的Java泛型错误,百思不得其解。
  3. nodejs libararies
  4. SELinux 基础命令
  5. 7-9 主从复制常见问题
  6. treeset可以重复吗_java容器(五)HashSet与TreeSet
  7. protected的继承方式有什么特点_草莓的授粉方式有哪些?各有什么特点
  8. 售票系统的组件图和部署图_门禁安装大样图、管线图、系统图、电锁安装图
  9. Python+OpenCV:图像修复(Image Inpainting)
  10. C++表达式:if 语句