备注

原发表于2016.05.21,资料已过时,仅作备份,谨慎参考

前言

最近在编写布局时,发现这一块是有很多值得深入学习的地方的。毕竟应用开发,界面展示是十分重要的部分。另外在开发时,为自己的代码做好规范,你不仅需要让几周几个月之后的你简单清晰地理解目前的代码,也要让一同参与开发的同伴理解。

这里有一篇文章可以进行参考:[Android]命名规范和编码规范

本次文章我们讲一下 Layout 布局的优化,一个层次分明无冗余的布局,不仅能带来更流畅的加载,还能使维护代码变得简单清晰。

检查和优化 Layout 层次

程序的每个组件和 Layout 都需要经过初始化、布局和绘制,如果布局嵌套层次过深,就会导致加载操作更为耗时,更严重的话还可能导致内存溢出。本节我们学习使用两个工具来检查和优化 Layout。

HierarchyViewer

HierarchyViewer 能够从可视化的角度直观地获得布局设计结构,帮助优化布局设计,然而似乎在没有 Root 的真机上使用不了,不知道是否有类似的工具。

如果你使用的是真机,暂时可以使用 Android Device Monitor 的 Dump View Hierarchy for UI Automator 功能来查看布局层次。

HierarchyViewer 位于 android_sdk\tools\hierarchyviewer.bat

  1. 连接设备启动要观察的应用
  2. 打开 HierarchyViewer,点击 Load View Hierarchy 来查看所选组件的层级

如图所示:

可以点击查看各个节点加载所耗费的时间,找出布局的不合理之处。

Lint

Android Lint是在 ADT 16 提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题。Lint 包含的一些检测规则有:

  • 使用 compound drawable 替代一个包含 ImageView 和 TextView 的 LinearLayout。
  • 合并根 FrameLayout
  • 没用的子节点或父节点
  • 硬编码问题
  • 拼写检查

如果你使用的 IDE 是 Android Studio,那么在平时编写 XML 布局时,肯定有接收到 Lint 显示的警告或错误提示,这些问题不一定会导致布局无法使用,但对于项目的规范性和维护性来说是十分重要的。

Android Studio 可在菜单项 Analyze - Inspect Code,选择范围后对代码进行 Lint 检查,从检查结果中可以得到代码中不规范的编码,以便开发者进行修正。

<include> 标签

当你需要重用到一些比较复杂的组件,如一个 Toolbar 时,你可以使用 <include> 标签来把其他 Layout 嵌入到当前 Layout。

创建可重用布局

首先创建一个新的 XML 文件并定义 Layout。例如下面的 titlebar.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:background="@color/titlebar_bg"> <ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>

使用重用布局

在你想要插入重用布局的地方使用 <include> 标签:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background="@color/app_bg"
android:gravity="center_horizontal"> <include layout="@layout/titlebar"/> <TextView android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" /> ... </LinearLayout>

通过这种方式,可以提高布局的制作效率,也使得重用布局更加规整和易维护。当然,这种方式并不能减少布局的层次结构,只是便于代码管理。

<merge> 标签

<merge> 标签在你嵌套 Layout 时取消了 UI 层次中冗余的 ViewGroup,如上一节中的重用布局中,外层 ViewGroup 是一个 LinearLayout。但如果当我们重用该布局时,是插入到另一个 LinearLayout 中的话,就会导致 Layout 冗余,即其实只需要一个便足够了。

这时,<merge> 标签就派上用场了,你可以这样编写布局:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/> </merge>

当使用该布局文件时,系统会忽略掉 <merge> 标签,相当于只有两个 Button 组件插入到了父布局中。

通过该标签,可减少层次避免嵌套过深的情况发生。

ViewStub

ViewStub 是一个轻量视图,不需要大小信息,也不会在被加入的 Layout 中绘制任何东西,当你引入只在特殊情况才显示的布局,如进度条,出错信息,提示信息等布局时,就可以使用 ViewStub。

定义 ViewStub

<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />

其中 Android:id 指 ViewStub 的 id,仅在 ViewStub 可见之前使用。

inflatedId 是引入布局的 id。

加载 ViewStub

载入用 ViewStub 声明的布局有两种方式:

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

第一种是设置可见性,第二种是调用 inflate() 方法。

后者会返回引入的布局以便多次使用。

总结

以上便是本次布局优化的内容,我感觉还有更多的地方能够加以优化,但在网上搜索,对于 Layout 的优化,不外乎是上面几种方式。

更重要的还是对一个 UI 界面加以拆解,多思考能否用更简单的方式来实现界面,编写一份足够简单、层次清晰的 XML 文件。

参考资料

Android Training - Improving layouts

Android 布局优化

谈谈 Android 布局的优化

[旧][Android] 布局优化的更多相关文章

  1. 【转】Android布局优化之ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  2. Android布局优化之include、merge、ViewStub的使用

    本文针对include.merge.ViewStub三个标签如何在布局复用.有效减少布局层级以及如何可以按需加载三个方面进行介绍的. 复用布局可以帮助我们创建一些可以重复使用的复杂布局.这种方式也意味 ...

  3. 转:Android布局优化

    categories: Android 在Android开发中,我们常用的布局方式主要有LinearLayout.RelativeLayout.FrameLayout等,通过这些布局我们可以实现各种各 ...

  4. Android布局优化:include 、merge、ViewStub的详细总结

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要是对上篇博客的补充Android性能优化之UI渲染性能优化, 没有什么新东西,觉得应该是都掌握的玩意,写出来也只是自己做个小小的总结. ...

  5. [Android]Android布局优化之<include />

    转载请标明:转载于http://www.cnblogs.com/Liuyt-61/p/6602891.html -------------------------------------------- ...

  6. Android成长日记-Android布局优化

    Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局 ...

  7. android 布局优化常用技巧

    android对多个模块都要是要的UI逻辑的致辞除了fragment之外,没有别的东西可以支持了, include,merge,viewstub只能支持公用的ui,但是这个通用支持不能包含逻辑(jav ...

  8. Android 布局优化

    转载自stormzhang的博客:http://stormzhang.com/android/2014/04/10/android-optimize-layout/ < include /> ...

  9. Android布局优化

    前言 本篇文章为Android优化的布局部分,该部分应该是Android中很重要的,无论是在自定义控件中,还是在简单的书写布局时,都应该尽量遵循一些优化原则,这样布局的绘制效率才会更高,体验才能更好. ...

随机推荐

  1. docker安装、下载镜像、容器的基本操作

    文章目录 一.docker安装与基本使用 1.docker的安装.从远程仓库下载镜像 2.配置docker国内源 二.创建容器 1.create i.创建容器 ii.进入容器 iii.启动容器 2.r ...

  2. 【分享数据】vm-insert的压缩比达到29倍

    vm-insert采用remote-write的http协议来接收metric数据,然后按照一定算法转发到vm-storage群集. vm-insert到vm-storage这里是用了自己的二进制协议 ...

  3. 【分享】让prometheus支持PUSH模式,可以使用remote write协议推送数据

    2021-10-21补充: 我通过修改源码来让prometheus支持remote-write,纯属多此一举: --enable-feature=remote-write-receiver这个命令行参 ...

  4. 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty

    参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...

  5. VAE变分自编码器

    我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...

  6. 浅谈MySQL同步到ElasticSearch的几种方式及其优缺点

    同步双写 优点:业务逻辑简单. 缺点: 硬编码,有需要写入mysql的地方都需要添加写入ES的代码: 业务强耦合: 存在双写失败丢数据风险: 性能较差:本来mysql的性能不是很高,再加一个ES,系统 ...

  7. java-异常-异常捕捉及多catch情况(try-catch)

    1 package p1.exception; 2 3 4 /* 5 * 异常处理的捕捉形式: 6 * 这是可以对异常进行针对性处理的方式. 7 * 8 * 具体格式是: 9 * try{ 10 * ...

  8. Mac中显示及隐藏文件和文件夹的方法

    一.方法一 直接在文件或文件夹名前面的加一个'.'点号,然后系统会弹出修改确认对话框,点好就行了. 隐藏文件 解除隐藏可以通过方法三显示所有隐藏文件,找到该文件去掉开头的'.',然后通过方法二来解除隐 ...

  9. Android开发----开发工具的安装与TextView组件

    开发工具的安装 选择使用Android Studio进行开发,Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...

  10. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...