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" />
View Code

   代码意思显而易见,其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>
View Code

   TableLayout 中每加入一个 TableRow 就表示在表格中添加了一行,然后在 TableRow中每加入一个控件,就表示在该行中加入了一列,TableRow 中的控件是不能指定宽度的。这里我们将表格设计成了三行两列的格式,第一行有一个 TextView 和一个用于输入账号的EditText,第二行也有一个 TextView 和一个用于输入密码的 EditText,我们通过将android:inputType 属性的值指定为 textPassword,使EditText变为密码输入框。第三行只有一个用于登录的按钮,前两行都有两列,第三行只有一列,所以我们使用android:layout_span="2"让登录按钮占据两列的空间。 另外,由于 在 TableRow 中 我 们 无 法 指 定 控 件 的 宽 度 ,可能导致每一行都不能充满屏幕的宽度。 这 时 可以使 用android:stretchColumns 属性让某一列控件拉伸以充满整个屏幕的宽度。代码的ProView如下:

  

 

  //End.

posted @ 2016-04-11 22:42  Vincent_Bryan  阅读(392)  评论(0编辑  收藏  举报