Android中的布局(layout)
1.主要的五种布局:
线性布局 - Linear Layout:按排列的方向(orientation)分为水平线性布局(
android:orientation="vertical"
)和垂直线性布局(
android:orientation="horizontal"//默认的是水平线性布局
)。
线性布局定义了排列方向后,会一直沿着该方向一直排列下去,除非利用嵌套再重新定义。
如下图所示,可以看做由多个水平线性布局组合而成的垂直线性布局。
常用代码:
android:layout_weight="数字" //表示剩余空间该控件所占的百分比,通常用于平均几个控件之间的位置,定义为1
注意: 区分“android:gravity”和“android:layout_gravity”。
android:gravity:是对控件本身来说的,是用来设置“控件自身的内容”应该显示在“控件自身体积”的什么位置,默认值是左侧。
android:layout_gravity:是相对于控件的父元素来说的,设置该控件在它的父元素的什么位置。
拓展连接:
相对布局 - Relative Layout:
android:layout_alignParentLeft="true" 位于父容器左上角
android:layout_alignParentBottom, android:layout_alignParentTop,
android:layout_alignParentRight 只能在父控件为RelativeLayout时才起作用,而对于像LinearLayout这样的布局不起作用
android:layout_centerInParent="true" 位于布局容器的中央位置;
layout_centerHorizontal位于布局容器水平居中位置;
layout_centerVertical位于布局容器垂直居中位置
被参照控件:控件与控件之间位置
android:layout_below="@id/***" 位于***组件下方
android:layout_toLeftOf="@id/###"位于###组件左则,紧贴并列
控件与控件之间对齐方式
android:layout_alignLeft="@id/***"与***组件左边界紧贴对齐,叠在一起;
android:layout_alignTop="@id/###"与###组件上边界对齐
可以通过另一个控件的ID来确定当前控件的位置(即任意两个控件之间的相对位置)。
android:layout_marginTop=“25dip” //顶部距离 android:gravity=“left” //控件中文本位置 android:layout_marginLeft="15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上(将该控件置于指定控件的上面); android:layout_below 将该控件的顶部置于给定ID的控件之下(将该控件置于指定控件的下面);
表格布局 - Table Layout:
表格布局模型以行列的形式管理子控件,每一行为一个TableRow的对象,当然也可以是一个View的对象。TableRow可以添加子控件,每添加一个为一列。N个TableRow之间是以N行的行数的方式纵向排列。
android:shrinkColumns="n”:设置第n+1列为可收缩的列。当可收缩的列太宽(内容过多)不会被挤出屏幕。当需要设置多列为可收缩时,将列序号用逗号隔开。
android:stretchColumns="n”:设置第n+1列为可伸展的列,以填满剩下的多余空白空间,若有多列需要设置为可伸展,请用逗号将需要伸展的列序号隔开。
列元素(Button)属性,定义子控件。
android:layout_colum:设置该控件在TableRow中指定的列。
android:layout_span:设置该控件所跨越的列数。
<TableRow/>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:text="为什么"/>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:text="你在这"/>
网格布局—Graid Layout:
网格布局是水平线性布局的,当控件水平方向达到定义的列数时会自动跳行
以下是一个计算器的例子:
<?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"> <GridLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:rowCount="5" //定义行最大格数为5,列最大格数为4的格子 android:columnCount="4" > <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textSize="40dp" android:layout_columnSpan="4" android:layout_gravity="fill" />//定义计算器的输入框 <Button android:text="1" android:textSize="30dp"/> <Button android:text="2" android:textSize="30dp"/> <Button android:text="3" android:textSize="30dp"/> <Button android:text="/" android:textSize="30dp"/> <Button android:text="4" android:textSize="30dp"/> <Button android:text="5" android:textSize="30dp"/> <Button android:text="6" android:textSize="30dp"/> <Button android:text="*" android:textSize="30dp"/> <Button android:text="7" android:textSize="30dp"/> <Button android:text="8" android:textSize="30dp"/> <Button android:text="9" android:textSize="30dp"/> <Button android:text="=" android:textSize="30dp" android:layout_rowSpan="3"//表示=的该格子占了3行 android:layout_gravity="fill"//如果需要往水平或竖直方向填充该控件,这句话不写,会多空出两个格子,但不会充满三个格子/> <Button android:text="0" android:textSize="30dp" android:layout_columnSpan="2" android:layout_gravity="fill"/> //该格子占了两列 <Button android:text="." android:textSize="30dp" android:layout_rowSpan="2" android:layout_gravity="fill" /> <Button android:text="+" android:textSize="30dp"/> <Button android:text="-" android:textSize="30dp"/> </GridLayout> </LinearLayout>
结果图:
绝对布局 - AbsoluteLayout:
绝对布局的子控件需要指定相对于此坐标布局的横纵坐标值,手机应用需要适应不同的屏幕大小,而这种布局模型不能自适应屏幕尺寸大小,所以应用的相对较少。
android:layout_x="10px"水平绝对位置
android:layout_y="10px"垂直绝对位置
帧布局 – FrameLayout:
帧布局,默认针对左边位置的(可用
android:layout_gravity="center"定义位置
)。所有的控件都有各自的坐标位置来显示-->
又框架布局是最简单的布局形式。所有添加到这个布局中的视图都以层叠的方式显示。第一个添加的控件被放在最底层,最后一个添加到框架布局中的视图显示在最顶层,上一层的控件会覆盖下一层的控件。这种显示方式有些类似于堆栈。