Android布局管理器浅析
16lz
2021-01-24
在Android应用开发中,为了更好地管理Android应用的用户界面里的各组件,Android提供了布局管理器来实现Android应用的图形用户界面平台无关性,其中所有布局管理器的父类为ViewGroup。一般来说,推荐使用布局管理器来管理组件的分布、大小,而不是直接设置组件位置和大小。在开发当中,最常用的方法是预先设置好容器边距(分布)、大小,然后其包含的组件使用"fill_match"或"wrap_content"自动适应父容器即可。 一、LinearLayout线性布局 LinearLayout布局管理器,即控制个组件横向/纵向排列(android:orientation属性控制)。需要注意的是,Android的线性布局不会换行,当组件一个挨着一个地排到头之后,剩下的组件将不会被显示出来。LinearLayout支持的常用XML属性。 (1)android:baselineAligned:该属性设置为false,将会阻止该布局管理器与它的子元素的基线对齐; (2)android:divider:用于设置垂直布局时两个按钮之间的分隔条; (3)android:gravity:用于设置LinearLayout(容器)所包含的所有子元素的对齐方式,如left|center_vertical代表所有子元素出现在屏幕左边,而且垂直居中。需要注意的是,一般容器才支持指定该属性; (4)android:orientation:设置布局管理器内组件的排列方式,如vertical为垂直排列(默认值); (5)android:measureWithLargestChild:当该属性设为true时,所有带权重的子元素都会具有最大元素的最小尺寸; (6)android:layout_gravity:指定该子元素在LinearLayout(父容器)中的对齐方式(某个子元素相对于LinearLayout容器而言); (7)android:layout_weight:指定该子元素在LinearLayout中所占的权重; 理解:LinearLayout布局管理器支持指定所包含控件(widgets)或容器(containers)的填充权值,通过该属性实现填充屏幕上的剩余空间。避免了在一个大屏幕中,一串widgets或者是containers挤成一堆的情况,而是允许他们放大填充空白,剩余的空间会按这些widgets或者是containers指定的权值比例分配屏幕。默认的 weight 值为0,表示按照widgets或者是containers实际大小来显示,若高于0的值,则将Container剩余可用空间分割,分割大小具体取决于每一个widget或者是container的layout_weight及该权值在所有widgets或者是containers中的比例。如有两个文本,权值分别为2和1,那么剩余空间的2/3给权值为2的,1/3大小给权值为1的。
二、TableLayout表格布局 TableLayout表格布局管理器继承于LinearLayout,其本质依然是线性布局管理器。表格布局采用行、列的形式来管理UI组件,TableLayout主要通过添加TableRow、其他主键来控制表格的行数和列数。即每次向TableLayout中添加一个TableRow(也为容器),就表示添加一行;向每个TableRow中添加其他子组件该表格就增加一列。 注意:在表格布局中,列的宽度由该列中最宽的那个单元格决定,整个表格布局的宽度则取决于父容器的宽度(默认沾满父容器)。TableLayout支持的常用XML属性如下: (1)支持LinearLayout所有属性; (2)android:collapseColumns:如果某个列或多个被设为Collapsed,该列的所有单元格被隐藏; (3)android:shrinkColumns:如果某个列或多个列设为Shrinkable,该列的所有单元格的宽度可以被收缩,以保证该表格能适应父容器的宽度; (4)android:stretchColumns:如果某个列或多个列设为Strtchable,该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格剩余空间。 实例如下:定义一个表格布局,指定第1列和第2列可以被拉伸,第3列可以被隐藏 <TableLayout android:id="+id/tableLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="1,2" android:collapseColumns="3"> <TableRow ....../> <TableRow ....../> </TableLayout>
三、FrameLayout帧布局 FrameLayout帧布局继承于ViewGroup组件,帧布局容器为每个加入其中的组件创建一个空白的区域(即为一帧)。每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐,帧布局的效果即把组件一个一个地叠加在一起。FrameLayout支持的常用XML属性如下: (1)android:gravity:设置容器中所有子组件的对齐方式; (2)android:layout_gravity:设置某个子组件相对于容器中的对齐方式; (3)android:foreground:设置该帧布局容器的前景图像; (4)android:foregroundGravity:定义绘制前景图像的gravity属性; 举例: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#f0f" android:height="300dp" android:width="300dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#f00" android:height="250dp" android:width="250dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#ff0" android:height="200dp" android:width="200dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#aaa" android:height="150dp" android:width="150dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#fc0" android:height="100dp" android:width="100dp" /> </FrameLayout> 显示效果:
注:android:width 定义控件上面的文本(TextView) 的宽度,需要与 android:layout_width 配合起来作用的,如果 android:layout_width="fill_parent" 的话,那么设置 android:width 是没有意义的。 四、RelativeLayout相对布局 RelativeLayout表示相对布局,相对布局管理器内子组件的位置总是相对兄弟组件、父容器来决定,每个组件或容器事先需指定android:id属性。RelativeLayout相对布局支持的常用XML属性如下: (1)android:gravity:设置该布局容器各子组件的对齐方式(整体相对于父容器); (2)android:ignoreGravity:设置哪个组件不受gravity属性的影响; (3)android:layout_centerHorizontal:控制该子组件是否位于布局容器的水平居中; (4)android:layout_centerVertical:控制该子组件是否位于布局容器的垂直居中;
(5)android:layout_centerInParent:控制该子组件是否位于布局容器的中央位置;
(6)android:layout_alignParentButtom:控制该子组件是否位于布局容器的低端对齐;
(7)android:layout_alignParentLeft:控制该子组件是否位于布局容器的左边对齐; (8)android:layout_alignParentRight:控制该子组件是否位于布局容器的右边对齐;
(9)android:layout_alignParentTop:控制该子组件是否位于布局容器的顶端对齐;
(10)android:layout_toRightOf:控制该子组件位于给出ID组件的右侧; (11)android:layout_toLeftOf:控制该子组件位于给出ID组件的左侧;
(12)android:layout_above:控制该子组件位于给出ID组件的上方;
(13)android:layout_below:控制该子组件位于给出ID组件的下方;
(14)android:layout_alignTop:控制该子组件位于给出ID组件的上边界对齐;
(15)android:layout_alignBottom:控制该子组件位于给出ID组件的下边界对齐;
(16)android:layout_alignLeft:控制该子组件位于给出ID组件的左边界对齐;
(17)android:layout_alignRight:控制该子组件位于给出ID组件的右边界对齐;
五、GridLayout网格布局 GridLayout网格布局是Android 4.0新增的布局管理器,只能在Android 4.0及以后的版本使用。GridLayout类似于HTML中的table标签,它把整个容器划分成为"行*列"个网格,每个网格可以放置一个组件,另外,也可以设置一个组件横跨多个列和多个行。GridLayout相对布局支持的常用XML属性如下: (1)android:alignmentMode:设置该布局管理器采用的对齐模式; (2)android:columnCount:设置该网格的列数量; (3)android:clolumnOrderPreserved:设置该网格容器是否保留列序列号; (4)android:rowCount:设置该网格的行数量; (5)android:rowOrderPreserved:设置该网格容器是否保留行序列号; (6)android:useDefaultMargins:设置该布局管理器是否使用默认的页边距 (7)android:layout_column:设置该子组件在GridLayout的第几列 (8)android:layout_columnSpan:设置该子组件在GridLayout横向上跨几行列
(9)android:layout_row:设置该子组件在GridLayout的第几行
(10)android:layout_rowSpan:设置该子组件在GridLayout纵向上跨几行
(11)android:layout_gravity:设置该子组件采用何种方式占据该网格的空间(相对于单个网格而言)
六、Android中常用的距离单位 1.px:像素,即每个px对应屏幕上的一个店。 2.dip/dp:设备独立像素。即一种基于屏幕密度的抽象单位,在每英寸160点的显示器上,1dip=1px,用于设置组件大小或距离。随着屏幕密度的改变,dip与px的换算会发生改变。 3.sp(scaled pixels,比例像素):主要处理字体的大小,可以根据用户的字体大小首选项进行缩放; 4.in:英寸,标准的长度单位; 5.pt:磅,1/72英寸
二、TableLayout表格布局 TableLayout表格布局管理器继承于LinearLayout,其本质依然是线性布局管理器。表格布局采用行、列的形式来管理UI组件,TableLayout主要通过添加TableRow、其他主键来控制表格的行数和列数。即每次向TableLayout中添加一个TableRow(也为容器),就表示添加一行;向每个TableRow中添加其他子组件该表格就增加一列。 注意:在表格布局中,列的宽度由该列中最宽的那个单元格决定,整个表格布局的宽度则取决于父容器的宽度(默认沾满父容器)。TableLayout支持的常用XML属性如下: (1)支持LinearLayout所有属性; (2)android:collapseColumns:如果某个列或多个被设为Collapsed,该列的所有单元格被隐藏; (3)android:shrinkColumns:如果某个列或多个列设为Shrinkable,该列的所有单元格的宽度可以被收缩,以保证该表格能适应父容器的宽度; (4)android:stretchColumns:如果某个列或多个列设为Strtchable,该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格剩余空间。 实例如下:定义一个表格布局,指定第1列和第2列可以被拉伸,第3列可以被隐藏 <TableLayout android:id="+id/tableLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="1,2" android:collapseColumns="3"> <TableRow ....../> <TableRow ....../> </TableLayout>
三、FrameLayout帧布局 FrameLayout帧布局继承于ViewGroup组件,帧布局容器为每个加入其中的组件创建一个空白的区域(即为一帧)。每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐,帧布局的效果即把组件一个一个地叠加在一起。FrameLayout支持的常用XML属性如下: (1)android:gravity:设置容器中所有子组件的对齐方式; (2)android:layout_gravity:设置某个子组件相对于容器中的对齐方式; (3)android:foreground:设置该帧布局容器的前景图像; (4)android:foregroundGravity:定义绘制前景图像的gravity属性; 举例: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#f0f" android:height="300dp" android:width="300dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#f00" android:height="250dp" android:width="250dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#ff0" android:height="200dp" android:width="200dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#aaa" android:height="150dp" android:width="150dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#fc0" android:height="100dp" android:width="100dp" /> </FrameLayout> 显示效果:
注:android:width 定义控件上面的文本(TextView) 的宽度,需要与 android:layout_width 配合起来作用的,如果 android:layout_width="fill_parent" 的话,那么设置 android:width 是没有意义的。 四、RelativeLayout相对布局 RelativeLayout表示相对布局,相对布局管理器内子组件的位置总是相对兄弟组件、父容器来决定,每个组件或容器事先需指定android:id属性。RelativeLayout相对布局支持的常用XML属性如下: (1)android:gravity:设置该布局容器各子组件的对齐方式(整体相对于父容器); (2)android:ignoreGravity:设置哪个组件不受gravity属性的影响; (3)android:layout_centerHorizontal:控制该子组件是否位于布局容器的水平居中; (4)android:layout_centerVertical:控制该子组件是否位于布局容器的垂直居中;
(5)android:layout_centerInParent:控制该子组件是否位于布局容器的中央位置;
(6)android:layout_alignParentButtom:控制该子组件是否位于布局容器的低端对齐;
(7)android:layout_alignParentLeft:控制该子组件是否位于布局容器的左边对齐; (8)android:layout_alignParentRight:控制该子组件是否位于布局容器的右边对齐;
(9)android:layout_alignParentTop:控制该子组件是否位于布局容器的顶端对齐;
(10)android:layout_toRightOf:控制该子组件位于给出ID组件的右侧; (11)android:layout_toLeftOf:控制该子组件位于给出ID组件的左侧;
(12)android:layout_above:控制该子组件位于给出ID组件的上方;
(13)android:layout_below:控制该子组件位于给出ID组件的下方;
(14)android:layout_alignTop:控制该子组件位于给出ID组件的上边界对齐;
(15)android:layout_alignBottom:控制该子组件位于给出ID组件的下边界对齐;
(16)android:layout_alignLeft:控制该子组件位于给出ID组件的左边界对齐;
(17)android:layout_alignRight:控制该子组件位于给出ID组件的右边界对齐;
五、GridLayout网格布局 GridLayout网格布局是Android 4.0新增的布局管理器,只能在Android 4.0及以后的版本使用。GridLayout类似于HTML中的table标签,它把整个容器划分成为"行*列"个网格,每个网格可以放置一个组件,另外,也可以设置一个组件横跨多个列和多个行。GridLayout相对布局支持的常用XML属性如下: (1)android:alignmentMode:设置该布局管理器采用的对齐模式; (2)android:columnCount:设置该网格的列数量; (3)android:clolumnOrderPreserved:设置该网格容器是否保留列序列号; (4)android:rowCount:设置该网格的行数量; (5)android:rowOrderPreserved:设置该网格容器是否保留行序列号; (6)android:useDefaultMargins:设置该布局管理器是否使用默认的页边距 (7)android:layout_column:设置该子组件在GridLayout的第几列 (8)android:layout_columnSpan:设置该子组件在GridLayout横向上跨几行列
(9)android:layout_row:设置该子组件在GridLayout的第几行
(10)android:layout_rowSpan:设置该子组件在GridLayout纵向上跨几行
(11)android:layout_gravity:设置该子组件采用何种方式占据该网格的空间(相对于单个网格而言)
六、Android中常用的距离单位 1.px:像素,即每个px对应屏幕上的一个店。 2.dip/dp:设备独立像素。即一种基于屏幕密度的抽象单位,在每英寸160点的显示器上,1dip=1px,用于设置组件大小或距离。随着屏幕密度的改变,dip与px的换算会发生改变。 3.sp(scaled pixels,比例像素):主要处理字体的大小,可以根据用户的字体大小首选项进行缩放; 4.in:英寸,标准的长度单位; 5.pt:磅,1/72英寸
更多相关文章
- Android之路之十七(重要组件之Service)
- Android(安卓)Fragment的使用
- Android用户界面开发(10):Button
- Android用户界面开发(11):Menu
- 免费的Android(安卓)UI库及组件推荐
- 深入Android【四】—— 组件调用
- 【Android】Navigation初试-基于官方demo的练习
- 安卓开发学习之002 LinearLayout之android:layout_gravity详解
- ReactNative全面屏(Android)适配问题