[旧][Android] 布局优化
备注
原发表于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
- 连接设备启动要观察的应用
- 打开 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布局优化之ViewStub
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...
- Android布局优化之include、merge、ViewStub的使用
本文针对include.merge.ViewStub三个标签如何在布局复用.有效减少布局层级以及如何可以按需加载三个方面进行介绍的. 复用布局可以帮助我们创建一些可以重复使用的复杂布局.这种方式也意味 ...
- 转:Android布局优化
categories: Android 在Android开发中,我们常用的布局方式主要有LinearLayout.RelativeLayout.FrameLayout等,通过这些布局我们可以实现各种各 ...
- Android布局优化:include 、merge、ViewStub的详细总结
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要是对上篇博客的补充Android性能优化之UI渲染性能优化, 没有什么新东西,觉得应该是都掌握的玩意,写出来也只是自己做个小小的总结. ...
- [Android]Android布局优化之<include />
转载请标明:转载于http://www.cnblogs.com/Liuyt-61/p/6602891.html -------------------------------------------- ...
- Android成长日记-Android布局优化
Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局 ...
- android 布局优化常用技巧
android对多个模块都要是要的UI逻辑的致辞除了fragment之外,没有别的东西可以支持了, include,merge,viewstub只能支持公用的ui,但是这个通用支持不能包含逻辑(jav ...
- Android 布局优化
转载自stormzhang的博客:http://stormzhang.com/android/2014/04/10/android-optimize-layout/ < include /> ...
- Android布局优化
前言 本篇文章为Android优化的布局部分,该部分应该是Android中很重要的,无论是在自定义控件中,还是在简单的书写布局时,都应该尽量遵循一些优化原则,这样布局的绘制效率才会更高,体验才能更好. ...
随机推荐
- openSUSE修改grub来修复对win8的引导
前言:继上一次安装试用各版本linux发行版后,由于做项目将机器纯windows了一把,现在又想安回centos,各种挫折折腾两天玩残一个u盘日,其中包括自己本本的原装系统也崩了,各种泪奔,下面记录一 ...
- 话说C#程序员人手一个ORM
话说C#程序员人手一个ORM,确实没有必要再写ORM了,不过我的ORM并不是新的,是从DBHelper演化过来的,算是DBHelper魔改版. 目前流行的ORM有EF.Dapper.SqlSugar. ...
- fluentd学习笔记
转载自http://blog.csdn.net/qq_27252133/article/details/53520416 原文https://blog.laisky.com/p/fluentd/ 最近 ...
- 基于Centos7.X的CS:GO社区服搭建
基于Centos7.X的CS:GO私人服务器搭建 由于比完了赛,在学校太过无聊,便想搭建一个CSGO社区服务器,方便舍友同学进来游玩,顺便帮助一些有想法的人,让他们少走一点弯路 一.创建新用户,并下载 ...
- K8s QoS Pod资源服务质量控制
Kubernetes 中如果一个 Node 节点上的 Pod 占用资源过多并且不断飙升导致 Node 节点资源不足,可能会导致为了保证节点可用,将容器被杀掉.在遇见这种情况时候,我们希望先杀掉那些不太 ...
- Hbase 项目
需求分析 1) 微博内容的浏览,数据库表设计 2) 用户社交体现:关注用户,取关用户 3) 拉取关注的人的微博内容 表结构 代码实现 1) 创建命名空间以及表名的定义 2) 创建微博内容表 3) 创 ...
- 我在 Gitee 上发现了一个简洁又好用的网络音乐播放器!
这几天无聊的时候我想听听歌,但我想要找一个简单快速的网络音乐播放器来用用.这时我在 Gitee 上看见一个看上去不错的开源项目 -- Hi音乐. 项目链接:https://gitee.com/hi-j ...
- 【源码】Redis Server启动过程
本文基于社区版Redis 4.0.8 1. 初始化参数配置 由函数initServerConfig()实现,具体操作就是给配置参数赋初始化值: //设置时区 setlocale(LC_CO ...
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
- Java线程池实现原理及其在美团业务中的实践(转)
转自美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 随着计算机行业的飞速发展,摩尔定律逐 ...