-
上篇文章中优化了无网络布局那块的东西,这篇简单介绍下布局优化,也就是Android布局中常用到的include、merge、ViewStub标签的使用
1.include:
- 通常使用在多处重复使用到的布局,将重复的布局部分抽离出来到一个单独的布局,然后在各个重复使用到的地方include下即可
- 在具体的使用中可以注意下以下几点:
1、抽出来需要include的布局可以将最外层的布局使用merge,这也是merge的作用所在,最终layout的结果就是将 merge中的内容直接放置到include的位置,这样可以省去多余的嵌套;
2、当然也不用刻意的去使用merge,它可以当做是用来在include中替换FrameLayout的; - 使用场景:标题栏(TitleBar)、底部常用确认和取消按钮等等
2.merge:
- 通常是来用配合include来使用的
- 最常见的用处就是替换掉FrameLayout布局,官方的说法是这样可以减少一级布局层次,达到布局优化的效果
3.ViewStub:
-
ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法。当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存空间
-
让ViewStub可见有两种方法: 第一是通过setVisibility,第二种就是通过inflate()方法。但是这两句代码不能共存,因为inflate方法只能调用一次,而setVisibility实际上会间接调用inflate
-
对ViewStub的inflate操作只能进行一次,因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。
-
上面所讲到的ViewStub指向的布局文件解析inflate并替换掉当前ViewStub本身,并不是完全意义上的替换(与include标签还不太一样),替换时,布局文件的layout params是以ViewStub为准,其他布局属性是以布局文件自身为准。
-
ViewStub不能与merge标签一起使用
-
使用场景:无网络、空数据、未登录布局等等
网友评论