Android 布局优化
虽然目前安卓 Android 手机内存可以到了 8G,处理器到了 8 核,但也不意味着 Android 应用可以无限制的使用内存和 CPU 资源,过多的使用内存会导致内存溢出,触发 OOM 错误,过多的使用 CPU 资源会导致手机变得卡顿甚至出现程序无法响应的情况,出现 ANR。无论出现 OOM 还是 ANR,对于用户的体验都是毁灭性打击,严重损害用户使用该应用的积极性。
ConstraintLayout 布局
布局优化很简单,就是减少布局文件的层次,减少 Android 绘制时候的工作。
16年I/O大会上,google发布了全新的布局 -- ConstraintLayout,可以有效地解决布局嵌套过多的问题,提高页面性能,目前安卓新建一个布局的文件默认的布局就是 ConstraintLayout,具体使用可以移驾我同学写的博客,或者前往 ConstraintLayout 官方文档。
include 标签共享布局
使用 XML 文编编写 Android 应用布局的界面时,经常会遇到在不同的界面需要实现相同的布局,这时候就会写出重复代码,这时候最佳实践方案是将通用的布局抽取出来,独立成一个 XML 文件,需要用到的时候使用 include 标签引入进来,达到布局重用的效果。
merge 标签
merge 标签一般和 include 标签一起使用从而减少布局的层级,通过 merge 标签就可以去掉多余的外面一层 Layout 布局。
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="merge_text"
/>
</merge>
ViewStub
ViewStub 继承了 View,非常轻量且宽高都是0,因此其本身不参与任何的布局和绘制过程。意义在于按需加载所需的布局文件。
<ViewStub
android:id="@+id/vs_import"
android:layout="@layout/widget"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
在需要加载 ViewStub 时,可以按照如下方式进行。
ViewStub vsImport = findViewById(R.id.vs_import);
vsImport.setVisibility(View.VISIBLE);
或者
ViewStub vsImport = findViewById(R.id.vs_import);
vsImport.inflate();
注意:inflate 如果多次调用会导致程序崩溃,所以推荐使用第一种方法。原因是ViewStub 被 inflate 后就不会在布局中存在。
当 ViewStub 通过上诉两个方法加载之后,ViewStub 就会被它内部的布局替换掉,这个时候 ViewStub 就不再是整个布局结构的一部了。