Android 布局优化
1、<include>
合理使用include标签。
优点:增加对公共布局的复用
缺点:可能会产生多余的布局嵌套
2、<merge>
优点:<merge>标签是作为<include>标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。大家都知道,Android去解析和展示一个布局是需要消耗时间的,布局嵌套的越多,那么解析起来就越耗时,性能也就越差,因此我们在编写布局文件时应该让嵌套的层数越少越好。
<merge/>多用于替换FrameLayout或者当一个布局包含另一个时,<merge/>标签消除视图层次结构中多余的视图组。
缺点:使用有些限制:
- merge必须放在布局文件的根节点上。
- merge并不是一个ViewGroup,也不是一个View,它相当于声明了一些视图,等待被添加。
- merge标签被添加到A容器下,那么merge下的所有视图将被添加到A容器下。
- 因为merge标签并不是View,所以在通过LayoutInflate.inflate方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为true,也就是必须为merge下的视图指定一个父亲节点。
- 如果Activity的布局文件根节点是FrameLayout,可以替换为merge标签,这样,执行setContentView之后,会减少一层FrameLayout节点。
- 自定义View如果继承LinearLayout,建议让自定义View的布局文件根节点设置成merge,这样能少一层结点。
- 因为merge不是View,所以对merge标签设置的所有属性都是无效的。
3、需要时使用<ViewStub>
优点:<ViewStub >标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub >标签,以减少内存使用量,加快渲染速度。<ViewStub >是一个不可见的,大小为0的View。
缺点:
- 还不支持 <merge> 标签
- ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了,一旦ViewStub visible/inflated,则ViewStub将从视图框架中移除,其id view_stub也会失效,
- ViewStub被绘制完成的layout文件取代,并且该layout文件的root view的id是android:inflatedId指定的id
panel_import,root view的布局和ViewStub视图的布局保持一致
用法:在你需要的时候,根据id获取ViewStub的实例,调用 setVisibility(View.VISIBLE) 或者 inflate()让其显示即可
((ViewStub) findViewById(R.id.view_stub)).setVisibility(View.VISIBLE);
// or View
importPanel = ((ViewStub) findViewById(R.id.view_stub)).inflate();
- <ViewStub
- android:id="@+id/view_stub"
android:inflatedId="@+id/panel_import"- android:layout="@layout/profile_extra"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
4、听说我们要尽可能地用 RelativeLayout ?
说法不正确,一般情况下,如果使用 LinearLayout,则一定要保证层级不能太深;如果使用 RelativeLayout,则需要尽量避免嵌套。
浙公网安备 33010602011771号