一个丰富的界面是由很多个控件组成的,如何让各个控件都有条不紊的摆放在介面上,这就需要布局来实现了,布局可以说是一种容器,可以按照一定规律调整控件的位置,布局之内也可以放置布局,完成一些复杂的界面。常用的布局有以下五种:
LinearLayout——线性布局
RelativeLayout——相对布局
FrameLayout——帧布局
TableLayout——表格布局
AbsoluteLayout——绝对布局(基本不用)
4.0版本新特性:
GridLayout——网格布局
线性布局,其中的控件会自动按照水平或垂直的方式依次排列。
(1)android:orientation属性:指定其排列方向,vertical代表垂直排列,horizontal代表水平排列,如果不定义的话,默认为horizontal。下面根据代码可以看看具体效果。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" //horizontal
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button3"/>
LinearLayout>
注释:wrap_content:表示控件占用自身大小的空间
match_parent:表示控件占满其父控件,在早期版本中叫做fill_parent
(2)android:layout_gravity属性
用来设置对齐方式的,可选值包括top, bottom, left , right, center_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill , clip_vertical, clip_horizontal , start, end。根据意思可知道是怎样的对齐方式,此处不再进行代码以及图片展示了。
(3)android:layout_weight和weightSum属性
LinearLayout特有的属性。它表示比重的意思,可实现百分比布局
weight意义为控件按照比例分配父控件剩余控件,①如果两个控件的宽度都为match_parent,父控件的剩余控件为负数,按比例分配就会显示为反比例。②如果按照严格的比例分配的话请赋值为0dp。
weightSum意义为比重和,设置好总的比重份数,可以在子控件中设置占比重和的份数。代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:text="Button1"
android:layout_weight="3"/>
<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:text="Button2"
android:layout_weight="1"/>
LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4"
>
<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:text="Button1"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:text="Button2"
android:layout_weight="2"/>
LinearLayout>
(4)android:layout_marginxxx 和 android:layout_paddingxxx属性
xxx可代表:Bottom,End,Left, Right, Start, Top
margin表示的是view的边缘与临近控件的边缘的距离
padding填充的意思,指的是view中的content与view边缘的距离。
简单地说,margin指的是外部离开的距离,padding指的是内部离开的距离。
(5)android:visibility属性
Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible (可见)”、“invisible(不可见)”、“gone(隐藏)”。主要用来设置控制控件的显示和隐藏。
相对布局中的视图组件是按相互之间的相对位置来确定的,四套相对属性,①相对父控件位置,②相对父控件居中方式,③相对子控件位置,④相对子控件边缘对齐
(1)android:layout_alignParentxxx(与父控件边缘对齐)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<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="右上角"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左下角"
android:layout_alignParentBottom="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右下角"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="横向中心"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="横向中心"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="纵向中心"
android:layout_centerVertical="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="纵向中心"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="中心"
android:layout_centerInParent="true"/>
RelativeLayout>
(2)android:layout_centerxxx(与父控件中心对齐)
(3)android:layout_toxxxof和android:layout_above(below)(子控件与子控件对齐)
(2)(3)例结合在一起进行代码和图片的展示
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:id="@+id/buttonPanel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="目标控件"
android:layout_centerInParent="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="目标控件上方"
android:layout_above="@+id/buttonPanel"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="目标控件下方"
android:layout_below="@+id/buttonPanel"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="目标控件右边"
android:layout_toRightOf="@+id/buttonPanel"
android:layout_centerVertical="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="目标控件左边"
android:layout_toLeftOf="@+id/buttonPanel"
android:layout_centerVertical="true"/>
RelativeLayout>
(4)android:layout_alignxxx(子控件与子控件边缘对齐)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/buttonPanel"
android:layout_width="200dp"
android:layout_height="200dp"
android:text="目标控件"
android:layout_centerInParent="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左边缘对齐"
android:layout_alignLeft="@+id/buttonPanel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右边缘对齐"
android:layout_alignRight="@+id/buttonPanel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上边缘对齐"
android:layout_alignTop="@+id/buttonPanel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下边缘对齐"
android:layout_alignBottom="@+id/buttonPanel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="基准线对齐"
android:layout_alignBaseline="@+id/buttonPanel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左下角对齐"
android:layout_alignLeft="@+id/buttonPanel"
android:layout_alignBottom="@+id/buttonPanel"/>
RelativeLayout>
帧布局中的每一个组件都代表一个画面,是一层一层覆盖的。
默认以屏幕左上角作为(0, 0)坐标,按组件定义的先后顺序依次逐屏显示,后面出现的会覆盖前面的画面。控件可以通过android:layout_gravity属性控制自己在父控件中的位置。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#005788"/>
<Button
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#991155"
android:layout_gravity="bottom"/>
<Button
android:layout_width="50dp"
android:layout_height="match_parent"
android:background="#eefd1d" />
FrameLayout>
TableLayout属于行和列形式的管理控件,每行为一个TableRow对象,也可以是一个View对象。
在TableRow中还可以继续添加其他的控件,每添加一个子控件就成为一列。TableLayout不会生成边框。
(1)android:collapseColumns:隐藏某一列
(2)android:shrinkColumns=“0,1,2…”:收缩哪几列达到充满(用在所有列自适应超出屏幕)
(3)android:stretchColumns=“0,1,2…”:扩充哪几列(用在所在列自适应后未充满的情况)
(4)android:layout_span :跨列
因为该布局是采用坐标的形式来进行布局定位的,布局的dp都是固定的,以至于在不同分辨率的手机上显示的布局大小不同造成差异,因此Android中很少有采用这种布局方式的。