一、FrameLayout
1) android3.0以下系统中,FrameLayout包含的一级节点View的layout_margin依赖于layout_gravity属性(可以将layout_gravity理解为margin的参考点),必须设置layout_gravity属性layout_margin才生效。如果在开发中需要兼容2.x系统,在设置FrameLayout的margin时,一定要加上layout_gravity=“top|left”属性。
2) 向FrameLayout添加多个控件时,一般最大控件确定了布局大小,所以如果最大控件在加载布局时不可见,那么在视图完全加载完毕后将其置为可见时,只能显示一部分。可以通过setMeasureAllChildren(true)来解决该问题。
android:measureAllChilren=“true”
二、LinearLayout
1) layout_weight 属性是指LinearLayout先给里面的控件分配完大小之后剩余空间的权重。
计算方式:(模拟一个LinearLayout容器内有3个TextView,weight分别为1:2:2,以width为例)
1、计算出3个TextView的width总和;
2、外层容器width-所有TextView的width总和=剩余可分配宽度(当TextView为fill_parent时,结果很可能是负数);
3、TextView宽度 = TextView自身宽度+按TextView的weight比例计算的剩余分配宽度;
所以当layout_width/layout_height设置为wrap_content或fill_parent时,实际宽度的分配并不是想象中的按weight比例来分配,因为还要加上view本身的宽度。而设置为0dp时,则可以完全按分配的weight比例来计算(因为按照如上计算方式,抛弃了View本身宽度时,就是按weight比例来计算了)。
android:layout_weightSum属性可以指定weight的最大总值,一般我们没有指定时,这个总值就是所有子元素(例如上述例子中3个TextView的weight总和)的layout_weight之和。这样的话就可以指定一个子元素占总可用空间的百分比。如设置外层容器的weightSum为1.0,某个TextView的weight为0.5,则该TextView占剩余可用空间的50%。
三、include
1) include设置的id会覆盖layout中顶层容器的id;
2) include可以设置layout_width和layout_height,但必须同时设置才能生效,并且会覆盖layout中顶层容器的设置,并且所有layout_*属性均可使用;
四、merge
1) <merge />只能作为XML布局的根标签使用;
2) 当Inflate以<merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true(参见inflate(int , android.view.ViewGroup, Boolean)方法);
五、ViewStub
在平时开发中,我们可以利用include实现布局的模块化,使比较复杂的布局文件结构更加清晰,也可以使用merge来优化布局。而ViewStub也可以用来优化布局,ViewStub不会影响UI初始化时的性能,他是一个不可见,不占布局位置,占用资源非常小的View。
1) 可以通过android:inflatedId属性重写布局文件中根元素的id;
2) 在ViewStub上设置的layout_*参数将会应用在包含的布局文件的根元素上;
3) 当你准备inflate ViewStub时,调用inflate方法即可。还可以设置ViewSub的Visibility为VISIBLE或INVISIBLE,也会触发inflate。值得注意的是,使用inflate()方法能返回布局文件的根View,不用自己去查找;
4) 当ViewStub inflate后,这个ViewStub就从View层次中移除了。因此,没有必要保留一个对ViewStub的引用(如在类的字段里);
5) ViewStub不能反复inflate,只能inflate一次,可保留inflate方法或findById返回的ViewSub引用资源的根元素对象;
6) ViewStub不支持merge;
参考资源
layout_weight
http://blog.csdn.net/xiaanming/article/details/13630837
http://blog.csdn.net/fiendvip/article/details/14516841
merge