Android的布局管理器本身就是一个UI组件,继承了View类,是ViewGroup的一个子类。
从图可以看出来,所有布局都可以作为容器类使用,因此可以调用多个重载的方法addView()向布局容器添加组件。
线性布局即LinearLayout,能将容器的组件一个挨着一个排列起来,可以控制横向排列还是纵向排列。当然,线性布局不会换行,当组件一个挨着一个排列到头之后,剩下的组件不会被显示出来。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:baselineAligned | setBaselineAligned(boolean) | 该属性值为fasle,将会阻止该布局管理器与它的子元素的基线对齐 |
android:divider | setDividerDrawable(Drawable) | 设置垂直布局时两个按钮之间的分隔条 |
android:gravity | setGravity(int) | 设置布局管理器内组件的对其方式 |
android:orientation | setOrientation(int) | 设置布局管理器内组件的排列方式 |
备注:
android:gravity——该属性值支持top、left、right、center_vertical、fill_vertivla、center_horizontal、fill_horizontal、fill,clip_vertical、clip_horizontal几个属性值。也可以同时制定多种对齐方式的组合,例如:left|center_vertical代表出现在屏幕的左边而且垂直居中
android:orientation——属性可以设置为horizontal(水平排列)、vertical(垂直排列)
XML属性 | 相关方法 | 说明 |
---|---|---|
android:layout_gravity | 设置该元素在LinearLayout中的对齐方式 | |
android:layout_weight | 设置该元素在LinearLayout中所占的权重 |
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮1" />
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮2" />
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮3" />
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮4" />
</LinearLayout>
表格布局继承了线性布局,所以本质上还是线性布局。TableLayout不需要明确的说出有多少行多少列,而是通过添加TableRow、其他组件来控制行数和列数。
每次向TableLayout添加一个TableRow,即添加一行,TableRow也是容器,可以在里面添加其他组件,每添加一个组件该表格就增加一列。如果直接在TableLayout中添加组件,这个组件就直接占一行。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:collapsColumns | setColumnCollapsd(int,boolean) | 设置需要被隐藏的列的序号,多个序号之间用逗号隔开 |
android:shrinkColumns | setColumnCollapsd(int,boolean) | 设置需要被收缩的列的序号,多个序号之间用逗号隔开 |
android:stretchColumns | setColumnCollapsd(int,boolean) | 设置需要被拉伸的列的序号,多个序号之间用逗号隔开 |
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<!--定义表格文件,指定第二例允许收缩,,第三列循序拉伸-->
<TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:shrinkColumns="1" android:stretchColumns="2">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="占一行的按钮"/>
<TableRow>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通按钮"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="收缩的按钮"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拉伸的按钮"/>
</TableRow>
</TableLayout>
<!--定义第二个表格文件,制定第二列隐藏-->
<TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:collapseColumns="1">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="占一行的按钮"/>
<TableRow>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通的按钮1"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="隐藏的按钮2"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通的按钮3"/>
</TableRow>
</TableLayout>
<!--定义第三个表格文件,指定第二列和第三列可以被拉伸-->
<TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:stretchColumns="1,2">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="占一行的按钮"/>
<TableRow>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通的按钮"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拉伸的按钮"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拉伸的按钮"/>
</TableRow>
<TableRow>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通的按钮"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拉伸的按钮"/>
</TableRow>
</TableLayout>
</LinearLayout>
相对布局(RelativeLayout)中,所有组件的位置总是相对兄弟组件、容器来决定。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:gravity | setGravity(int) | 设置布局容器内子组件的对其方式 |
android:ignoreGravity | setIgnoreGravity(int) | 设置哪个组件不受gravity属性的影响 |
XML属性 | 说明 |
---|---|
android:layout_centerHorizontal | 控制该子组件是否位于布局容器的水平居中 |
android:layout_centerVertical | 控制该子组件是否位于布局容器的垂直居中 |
android:layout_centerInParent | 控制该子组件是否位于布局容器的中央位置 |
android:layout_alignParentBottom | 控制该子组件是否与布局容器的底端对齐 |
android:layout_alignParentLeft | 控制该子组件是否与布局容器的左端对齐 |
android:layout_alignParentRight | 控制该子组件是否与布局容器的右端对齐 |
android:layout_alignParentTop | 控制该子组件是否与布局容器的顶端对齐 |
android:layout_toRightOf | 控制该子组件位于给出ID组件的右侧 |
android:layout_toLeftOf | 控制该子组件位于给出ID组件的左侧 |
android:layout_above | 控制该子组件位于给出ID组件的上方 |
android:layout_below | 控制该子组件位于给出ID组件的下方 |
android:layout_alignTop | 控制该子组件位于给出ID组件的上边界对齐 |
android:layout_alignBottom | 控制该子组件位于给出ID组件的下边界对齐 |
android:layout_alignLeft | 控制该子组件位于给出ID组件的左边界对齐 |
android:layout_alignRight | 控制该子组件位于给出ID组件的右边界对齐 |
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/view01" android:background="@drawable/feiji" android:layout_centerInParent="true"/>
<TextView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/view02" android:background="@drawable/feiji" android:layout_above="@id/view01" android:layout_alignLeft="@id/view01"/>
<TextView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/view03" android:background="@drawable/feiji" android:layout_below="@id/view01" android:layout_alignLeft="@id/view01"/>
<TextView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/view04" android:background="@drawable/feiji" android:layout_toLeftOf="@id/view01" android:layout_alignBottom="@id/view01"/>
<TextView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/view05" android:background="@drawable/feiji" android:layout_toRightOf="@id/view01" android:layout_alignTop="@id/view01"/>
</RelativeLayout>
帧布局(FrameLayout)中,为每个加入其中的组件创建一个空白的区域(称为一帧),每个子组件占一帧,这些帧会根据gravity属性自动对齐。帧布局中,每个组件是一个个的叠加在一起的。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:foreground | setForeGround(Drawable) | 设置该帧布局的前景图 |
android:foregroundGravity | setForeGroundGravity(int) | 设置前景图的gravity属性 |
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:id="@+id/view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="320dp" android:height="320dp" android:background="#f00" />
<TextView android:id="@+id/view2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="280dp" android:height="280dp" android:background="#0f0" />
<TextView android:id="@+id/view3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="240dp" android:height="240dp" android:background="#00f" />
<TextView android:id="@+id/view4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="200dp" android:height="200dp" android:background="#ff0" />
<TextView android:id="@+id/view5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="160dp" android:height="160dp" android:background="#f0f" />
<TextView android:id="@+id/view6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:width="120dp" android:height="120dp" android:background="#0ff" />
</FrameLayout>
网格布局(GridLayout)是Android4.0后新增的布局管理器,类似于HTML里面的table标签,他可以把整个布局划分n*m的网格。也可以设置一个组件横跨多少行多少列。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:alignmentMode | setAlignmentMode(int) | 设置该布局管理器采用的对齐模式 |
android:columnCount | setColumnCount(int) | 设置该网格的列数 |
android:columnOderPreserved | setColumnOderPreserved(boolean) | 设置该网格容器是否保留列序号 |
android:rowCount | setRowCount(int) | 设置该网格的行数 |
android:rowOderPreserved | setRowOderPreserved(boolean) | 设置该网格容器是否保留行序号 |
android:useDefaultMargins | setUseDefaultMargins(boolean) | 设置该网格布局是否使用默认的页边距 |
XML属性 | 相关方法 | 说明 |
---|---|---|
android:layout_column | 设置该子组件在GridLayout的第几列 | |
android:layout_columnSpan | 设置该子组件在GridLayout横向跨几列 | |
android:layout_gravity | setGravity(int) | 设置该子组件以什么方式占据网格空间 |
android:layout_row | 设置该子组件在GridLayout的第几行 | |
android:layout_rowSpan | 设置该子组件在GridLayout纵向跨几行 |
绝对布局(AbsoluteLayout)在大多数不赞成使用,因为支持Android应用的手机千差万别,屏幕大小分辨率都不一样,使用绝对布局很难控制组件的位置。这里只做一个简单的介绍
layout_x:指定该组件的X坐标
layout_y:指定该组件的Y坐标