高质量布局技巧——ViewStub延迟加载

来源:互联网 发布:forrest手表淘宝 编辑:程序博客网 时间:2024/04/28 12:03

高质量布局技巧——ViewStub延迟加载

一、ViewStub的概念

ViewStub是一种默认不可见的视图,直接继承自View。它可以理解成一个非常轻量级的View,与其他控件一样,有着自己独特的属性和特定方法。

二、ViewStub的作用

程序运行过程中,默认情况下无需显示ViewStub所指向的布局文件,只有在特定的某些较少条件下,此时ViewStub所指向的布局文件才需要被inflate加载,且此布局文件将直接替换当前ViewStub。这样,不必每次在onCreate的时候加载布局,只有需要的时候加载,就可以提高我们应用的性能。
举个例子说明一下:
ViewStub经常用在ListView的Item中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。当用户点击Item时,判断下当前是可见还是不可见,实时进行显示状态的转换即可。这样,可以减少加载的内存,因为不是每个item都会被点击。
示例如下:这部分的源码实现在项目中很多,就不放了。效果图大致如下:(效果图取自http://michaelye1988.iteye.com/blog/1416804 非常感谢)

其项目地址:https://github.com/michaelye/ViewStubDemo.git 有需求的同学自己去取吧。

三、ViewStub的特性

如果要满足其作用的话,那viewstub就需要一些独特的属性或者方法来支持。那么我们详细来说明一下。

1)当布局文件被解析时,ViewStub相比于其他控件,其所占内存很小。它主要作为一个“占位符”,放置于view tree中,且其默认是不可见的。它包含一个layout属性,用于指向ViewStub本身可能被替换掉的布局文件。当需要时候,通过ViewStub的inflate方法完成加载。
<ViewStub       android:id="@+id/viewstub_demo_image"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_marginLeft="5dip"      android:layout_marginRight="5dip"      android:layout="@layout/viewstub_demo_image_layout"/>  
2)在可见性设置过程中,也与其他的控件不太一样。首次设定设定时,都会自动inflate其指向的布局文件,并替换ViewStub本身,再次使用则是相对于对其指向的布局文件设置。
注:对ViewStub的inflate操作只能进行一次,因为inflate以后,其指向的布局文件已经替换了当前的ViewStub本身,一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因为,如果多次对ViewStub进行inflate,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。
0 0