再次拾起merge,include,viewStub

减少视图层级

        merge主要是进行UI布局的优化的,删除多余的层级,优化UI。多用于替换frameLayout或者当一个布局包含另一个布局的时候,例如你的主布局文件是垂直的,此时如果你引入一个垂直布局的.这时如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用标签优化。标签也就是排除一个布局插入另一个布局产生的多余的viewgroup.

使用方法:activity_merge_test.xml

再次拾起merge,include,viewStub_第1张图片

当别处使用的时候直接使用include,如下activity_main.xml

再次拾起merge,include,viewStub_第2张图片

这个时候就activity_merge_test就会根据父布局的排列方式排列。简单来说,如果activity_merge_test.xml使用的是linearLayout那么activity_main.xml就会有两个LinearLayout。多了一层viewgroup。


需要时使用

标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局像进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。特点是

1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控件,ViewStub所占内存很小;

2.布局文件inflate时,ViewStub主要是作为一个“占位符”的性质,放置于view tree中,且ViewStub本身是不可见的。ViewStub中有一个layout属性,指向ViewStub本身可能被替换掉的布局文件,在一定时机时,通过viewStub.inflate()或者setVisibility(int);

3.ViewStub本身是不可见的所以在布局文件按里面设置可见性是没有任何效果的,对ViewStub setVisibility(..)与其他控件不一样,ViewStub的setVisibility 成View.VISIBLE或INVISIBLE如果是首次使用,都会自动inflate其指向的布局文件。setVisibility会在内部调用inflate()方法。

4中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前ViewStub本身,并不是完全意义上的替换(与include标签还不太一样),替换时,布局文件的layout params是以ViewStub为准,其他布局属性是以布局文件自身为准。

5.可以通过isInflated()方法,判断ViewStub是够已经inflate过布局文件,避免再次inflate造成的程序错误。

6ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。

你可能感兴趣的:(再次拾起merge,include,viewStub)