Android学习笔记(八)——四种基本布局
//此系列博文是《第一行Android代码》的学习笔记,如有错漏,欢迎指正!
布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,或是嵌套子布局,从而编写出精美的界面。基本布局一般有四种,我们来逐个学习.
一、LinearLayout
LinearLayout 又称作线性布局,是一种非常常用的布局。通过 android:orientation 属性指定可以指定排列的线性方向,默认的指定是 horizontal,此时控件就会在水平方向上排列。
例如我们在布局文件里定义3个button,ProView如下:
改成vertical后便是:
需要注意的是,如果 LinearLayout 的排列方向是 horizontal,内部的控件就绝对不能将宽度指定为 match_parent,因为这样的话单独一个控件就会将整个水平方向占满,其他的控件就没有可放置的位置了。同样的道理,如果 LinearLayout的排列方向是 vertical,内部的控件就不能将高度指定为 match_parent。
布局文件中还有一个android:layout_gravity可以用于指定控件在布局中的对齐方式。android:layout_gravity 的可选值和 android:gravity 差不多。需要注意,当LinearLayout 的排列方向是 horizontal时, 只有垂直方向上的对齐方式才会生效, 因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。同样的道理,当 LinearLayout 的排列方向是 vertical 时,只有水平方向上的对齐方式才会生效。
如当我们在android:orientation 属性为vertical时,改变3个button的layout_gravity,可使ProView呈现如下图:
LinearLayout 中还有一个重要属性:android:layout_weight。当我们把不同控件的weight设置为不同的值,系统会为其按weight的比例分配大小,例如我们在排列方向为水平时,声明一个EditText和Button如下:
1 <EditText
2 android:id="@+id/input_message"
3 android:layout_width="0dp"
4 android:layout_height="wrap_content"
5 android:layout_weight="4"
6 android:hint="Type something"
7 />
8 <Button
9 android:id="@+id/send"
10 android:layout_width="0dp"
11 android:layout_height="wrap_content"
12 android:layout_weight="1"
13 android:text="Send"
14 />
由于我们使用了 android:layout_weight 属性,此时控件的宽度就不应该再由 android:layout_width 来决定,所以我们把layout_width都指定为0dp,其ProView效果如下:
假如我们将Button的layout_width指定为“wrap_content”,而EditText的layout_weight指定为1,此时Button 的宽度仍然按照 wrap_content 来计算,而 EditText 则会占满屏幕所有的剩余空间。使用这种方式编写的界面,不仅在各种屏幕的适配方面会非常好,而且看起来也更加舒服。
二、RelativeLayout
和 LinearLayout 相比,RelativeLayout 显得更加随意一些,它可以通过相对定位的方式让控件出现在布局的任何位置。
比如我们添加了下面3个代码:
1 <Button
2 android:id="@+id/button1"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:layout_alignParentLeft="true"
6 android:layout_alignParentTop="true"
7 android:text="Button 1" />
8
9 <Button
10 android:id="@+id/button2"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_centerInParent="true"
14 android:text="Button 2" />
15
16 <Button
17 android:id="@+id/button3"
18 android:layout_width="wrap_content"
19 android:layout_height="wrap_content"
20 android:layout_alignParentTop="true"
21 android:layout_alignParentRight="true"
22 android:text="Button 3" />
代码的意思显而易见,layout_alignParentLeft、layout_alignParentTop、layout_alignParentRight、 layout_alignParentBottom、layout_centerInParent 这几个属性由其字面可知:与父布局的相应位置对应。PreView如下:
我们也可以让控件相对于控件来定位:
1 <Button
2 android:id="@+id/button2"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:layout_centerInParent="true"
6 android:text="Button 2" />
7
8 <Button
9 android:id="@+id/button1"
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_above="@id/button2"
13 android:layout_toLeftOf="@id/button2"
14 android:text="Button 1" />
15
16 <Button
17 android:id="@+id/button3"
18 android:layout_width="wrap_content"
19 android:layout_height="wrap_content"
20 android:layout_above="@id/button2"
21 android:layout_toRightOf="@id/button2"
22 android:text="Button 3" />
代码意思显而易见,其ProView如下:
不过注意,当一个控件去引用另一个控件的 id 时,该控件一定要定义在引用控件的后面,不然会出现找不到 id的情况。
三、FrameLayout
FrameLayout 相比于前面两种布局就简单太多了,因此它的应用场景也少了很多。这种布局没有任何的定位方式,所有的控件都会摆放在布局的左上角,这里就不详细说明了。
四、TableLayout
TableLayout 允许我们使用表格的方式来排列控件。设计表格时我们尽量应该让每一行都拥有相同的列数,这样的表格也是最简单的。而当表格的某行一定要有不相等的列数时,就需要通过合并单元格的方式来
应对。下面我们来设计一个登陆界面的布局文件:
1 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:stretchColumns="1">
5
6 <TableRow>
7 <TextView
8 android:layout_height="wrap_content"
9 android:text="Account:" />
10 <EditText
11 android:id="@+id/account"
12 android:layout_height="wrap_content"
13 android:hint="Input your account" />
14 </TableRow>
15 <TableRow>
16 <TextView
17 android:layout_height="wrap_content"
18 android:text="Password:" />
19 <EditText
20 android:id="@+id/password"
21 android:layout_height="wrap_content"
22 android:inputType="textPassword" />
23 </TableRow>
24 <TableRow>
25 <Button
26 android:id="@+id/login"
27 android:layout_height="wrap_content"
28 android:layout_span="2"
29 android:text="Login" />
30 </TableRow>
31 </TableLayout>
TableLayout 中每加入一个 TableRow 就表示在表格中添加了一行,然后在 TableRow中每加入一个控件,就表示在该行中加入了一列,TableRow 中的控件是不能指定宽度的。这里我们将表格设计成了三行两列的格式,第一行有一个 TextView 和一个用于输入账号的EditText,第二行也有一个 TextView 和一个用于输入密码的 EditText,我们通过将android:inputType 属性的值指定为 textPassword,使EditText变为密码输入框。第三行只有一个用于登录的按钮,前两行都有两列,第三行只有一列,所以我们使用android:layout_span="2"让登录按钮占据两列的空间。 另外,由于 在 TableRow 中 我 们 无 法 指 定 控 件 的 宽 度 ,可能导致每一行都不能充满屏幕的宽度。 这 时 可以使 用android:stretchColumns 属性让某一列控件拉伸以充满整个屏幕的宽度。代码的ProView如下:
//End.