本篇文章所提到的控件指:控件和布局
布局的继承关系:LinearLayout,RelativeLayout,FrameLayout,AbsoluteLayout都是ViewGroup的子类,所以有些属性可以有交集,应具体对待。
而TableLayout是LinearLayout的子类,因此大多数LinearLayout的属性都可以用。
子类拥有父类的属性。
一、LinearLayout(orientation)
线性布局是按照水平或垂直的顺序将子元素(可以是控件或布局)依次按照顺序排列,每一个元素都位于前面一个元素之后,即控件在xml中所写的先后循序就是显示时控件的顺序。
线性布局及子类特有的属性:
权重:剩余屏幕占有的比例
一般情况:在那个方向上设权重,则将该方向的属性(height或者width)设置为0dp
如果在该方向设wrap_content:权重值越大,占得屏幕比例越多,但小不warp_contant
如果设match_parent:权重值越大,占得屏幕比例越小,但大大不过match_parent
缺点:缺乏灵活性,不能任意指定位置。不过掌握好权重能弥补很多线性布局的缺点。
不适用场景:两个空间之间有很大空隙的布局,虽然有layout_marginTop等类似属性,却不好控制具体位置,而且用layout_marginTop达到目的,也只是在特定分辨率手机上适配,不能很好适配其他分辨率。
二、RelativeLayout
按照子元素之间的相对位置关系完成布局的,作为Android系统五大布局中最灵活也是最常用的一种布局方式。
值得注意的是:相对布局的参照控件必须在被参照控件的后面,在编写xml布局文件时注意。
相对布局特有的属性:值是某个控件和布局的id
android:layout_below 在某控件的下方
android:layout_above 在某控件的的上方
android:layout_toLeftOf 在某控件的左边
android:layout_toRightOf 在某控件的右边
android:layout_alignTop 本控件的上边缘和某控件的的上边缘对齐
android:layout_alignLeft 本控件的左边缘和某控件的的左边缘对齐
android:layout_alignBottom 本控件的下边缘和某控件的的下边缘对齐
android:layout_alignRight 本控件的右边缘和某控件的的右边缘对齐
相对布局刚好填补了线性布局的缺点,但是相对布局也并非没有缺点。
缺点:每个空间都必须设置id,使用繁琐,如果修改了某一个控件则可能需要重新布局,操作不易。
注:某一个控件可能同时依赖于多个控件,一个控件同时可能被多个控件依赖。并非单一依赖。
三、FrameLayout:
所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。
特点:后添加进去的控件将从左上角覆盖先放进去的控件
适用场景:在开发中常做容器使用,用于动态添加布局对象。
四、AbsoluteLayout:
这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。
绝对布局中将所有的子元素通过设置android:layout_x 和 android:layout_y属性,将子元素的坐标位置固定下来,即坐标(android:layout_x, android:layout_y) ,layout_x用来表示横坐标,layout_y用来表示纵坐标。 屏幕左上角为坐标(0,0),横向往右为正方,纵向往下为正方。实际应用中,这种布局用的比较少,因为Android终端一般机型比较多,各自的屏幕大小。分辨率等可能都不一样,如果用绝对布局,可能导致在有的终端上显示不全等
值得注意:该布局的原点在左上角。
缺点:屏幕适配麻烦,容易出问题,在实际开发中不常用。
五、TableLayout:
表格布局,适用于多行多列的布局格式,每个TableLayout是由多个TableRow组成,一个TableRow就表示TableLayout中的每一行,这一行可以由多个子元素组成。实际上TableLayout和TableRow都是LineLayout线性布局的子类。但是TableRow的参数android:orientation属性值固定为horizontal,且android:layout_width=MATCH_PARENT,android:layout_height=WRAP_CONTENT。所以TableRow实际是一个横向的线性布局,且所以子元素宽度和高度一致。
值得注意的是:列和行下标是从0开始的
特殊属性:collapseColumns:隐藏列,多个列之间逗号隔开
StretchColumns:设置某个列是可伸展的。
shrinkColumns :可收缩的
一下两属性不能自动提示,不知为何,个人觉得不建议使用该属性。
android:layout_colum:设置控件在具体的列
android:layout_span:设置控件所跨越的列数。
使用场景:特别规范的展示数据或者选项区,除了特殊场景外,开发中一般不使用。
缺点:过于规范,不够灵活,不能设计出不规则的界面
总结:每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。每一个布局都有自己的使用场合,就像每个人一样在生活中扮演者重要角色,或多或少都有作用。
注意:有些界面虽然某个布局能单独完成,但是推荐使用布局嵌套。而且根布局推荐使用相对布局。
最常用的布局:FrameLayout做容器,而RelativeLayout和LinearLayout嵌套做布局。市面上的:三层式界面都是基于这样做的,最上面是标题栏,中间是动态加载的布局对象,最下面是RadioGroup。父容器是FrameLayout。
学习建议:根据java的继承关系去学习,从而形成知识框架。