在XML中定义Android的Layout时,有四个比较特别的标签是非常重要的,分别是<viewStub/>, <requestFocus />, <merge /> 和<include />,其中有三个是与资源复用有关。
1)<ViewStub />标签
ViewStub是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,在需要的时候再加载View,和Java中常见的性能优化方法延迟加载一样。当调用ViewStub的setVisibility函数设置为可见或则调用inflate()方法初始化该View的时候,ViewStub引用的资源开始初始化,然后引用的资源会替代掉ViewStub,把自己填充在ViewStub的原位置。因此在没有调用setVisibility(int)或inflate()方法之前ViewStub会一直存在组件树层级结构中,但是由于ViewStub非常轻量级,这对性能影响非常小。可以通过ViewStub的inflatedId属性来重新定义引用的layout的id(也就是说,加入我们所引用的layout的id是R.layout.prelayout,然后我们在ViewStub中添加属性android:inflatedId="@+id/subLayout“,那么我们就可以用R.layout.subLayout来引用这个layout了)。
示例:
<ViewStub android:>UI结构视图:
我们可以很明显的看到出现了两个framelayout节点,这两个意义完全相同的节点造成了资源浪费(这里可以提醒大家在开发工程中可以习惯性的通过hierarchyViewer查看当前UI资源的分配情况),那么如何才能解决这种问题呢(就当前例子是如何去掉多余的frameLayout节点),这时候就要用到<merge />标签来处理类似的问题了。我们将上边xml代码中的FrameLayout替换成merge:
<merge xmlns:andro>UI结构。
注:
* <merge />只可以作为layout的根节点。
* 当需要扩充的layout本身是由merge作为根节点的话,需要将被导入的layout置于viewGroup中,同时需要设置attachToRoot为true。
REFERENCES:http://hexen.blog.51cto.com/1110171/820197