转自:http://blog.csdn.net/dazlly/article/details/7860125

因为学习比较晚,我用的相关版本为SDK4.1、eclipse4.2,而自己看的教材都是低版本的,这造成了细节上的不同,有时候给学习造成了不小的困扰,不过这样也好,通过解决问题获得的知识理解更加深刻一点,这篇文章就是因为版本不同这个原因由来的。

使用上面说的版本新建一个Android项目,然后打开main.xml文件,注意看代码:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:layout_centerHorizontal="true"
  9. android:layout_centerVertical="true"
  10. android:text="@string/hello_world"
  11. tools:context=".Main" />
  12. </RelativeLayout>

RelativeLayout,这个就是五种布局的其中之一,而大多数教材上面讲的都是LinearLayout布局,布局的不同造成模拟机界面显示的不同,为了避免再次困然,先把五种布局都了解一下吧。

五个布局对象:RelativeLayout、LinearLayout、TableLayout、FrameLayout、AbsoulteLayout。

布局一:

相对布局RelativeLayout,定义各控件之间的相对位置关系,通过位置属性和各自的ID配合指定位置关系,在指定位置关系时引用的ID必须在引用之前先被定义,否则将出现异常。

layout/main.xml的代码

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:background="#FFFFFF"
  10. android:text="@string/first" />
  11. <TextView
  12. android:id="@+id/secondText"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:background="#FFFF00"
  16. android:text="@string/second" />
  17. <TextView
  18. android:id="@+id/thirdText"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:background="#FF00FF"
  22. android:text="@string/third" />
  23. <TextView
  24. android:id="@+id/fourthText"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:background="#00FFFF"
  28. android:text="@string/fourth" />
  29. </RelativeLayout>

定义了4个文本标签,各自的文本值(下面几种布局使用同样的strings.xml文件)

  1. <string name="first">First</string>
  2. <string name="second">Second</string>
  3. <string name="third">Third</string>
  4. <string name="fourth">Fourth</string>

为了清晰展示,从一到四标签的背景颜色为白黄红绿,注意看上面没有定义任何相对位置属性,结果:

都重合到一起了,这说明在没有定义相对位置属性的情况下,所有标签都是相对于屏幕左上角布局的,现在更改一下main.xml的代码:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:background="#FFFFFF"
  10. android:text="@string/first" />
  11. <TextView
  12. android:id="@+id/secondText"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:background="#FFFF00"
  16. android:layout_below="@id/firstText"
  17. android:text="@string/second" />
  18. <TextView
  19. android:id="@+id/thirdText"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:background="#FF00FF"
  23. android:layout_below="@id/secondText"
  24. android:text="@string/third" />
  25. <TextView
  26. android:id="@+id/fourthText"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:background="#00FFFF"
  30. android:layout_below="@id/thirdText"
  31. android:text="@string/fourth" />
  32. </RelativeLayout>

从二开始、每个标签都加了一个属性android:layout_below,意思是该组件位于引用组件的下方,而引用的组件就是这个属性值里面的内容“@id/要引用的id名”。然后再运行一下,看结果:

OK,符合预期,这就是相对布局,下面列出所有的位置属性以及他们代表的意思,参考一下:

android:layout_above 位于引用组件的上方
        android:layout_below 位于引用组件的下方
        android:layout_toLeftOf 位于引用组件的左方
        android:layout_toRightOf 位于引用组件的右方
        android:layout_alignParentTop 是否对齐父组件的顶部
        android:layout_alignParentBottom 是否对齐父组件的底部
        android:layout_alignParentLeft 是否对齐父组件的左端
        android:layout_alignParentRight 是否齐其父组件的右端
        android:layout_centerInParent 是否相对于父组件居中
        android:layout_centerHorizontal 是否横向居中
        android:layout_centerVertical 是否垂直居中

另外可能会用到:ViewGroup.LayoutParams.WRAP_CONTENT,在main.java中可以动态添加控件,这个是添加的控件长宽自适应内容。

布局二:

线性布局LinearLayout,按照垂直或者水平的顺序依次排列子元素(如果不指定,默认为水平),每一个子元素都位于前一个元素之后。这样形成单行N列,或者单列N行的布局;如果想要N行N列,可以嵌套使用LinearLayout。先看看效果:

layout/main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:background="#FFFFFF"
  10. android:text="@string/first" />
  11. <TextView
  12. android:id="@+id/secondText"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:background="#FFFF00"
  16. android:text="@string/second" />
  17. <TextView
  18. android:id="@+id/thirdText"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:background="#FF00FF"
  22. android:text="@string/third" />
  23. <TextView
  24. android:id="@+id/fourthText"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:background="#00FFFF"
  28. android:text="@string/fourth" />
  29. </LinearLayout>

这里没有指定任何属性,显示如下,可以看到4个标签水平依次排列:

现在略微修改一下代码,在LinearLayout节点内添加属性android:orientation="vertical",显示如下:

再来演示下N行N列的布局方法,使用嵌套结构,还是main.xml代码:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:orientation="horizontal" >
  10. <TextView
  11. android:id="@+id/firstText"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:background="#FFFFFF"
  15. android:text="@string/first" />
  16. <TextView
  17. android:id="@+id/secondText"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:background="#FFFF00"
  21. android:text="@string/second" />
  22. </LinearLayout>
  23. <LinearLayout
  24. android:layout_width="match_parent"
  25. android:layout_height="wrap_content"
  26. android:orientation="horizontal" >
  27. <TextView
  28. android:id="@+id/thirdText"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:background="#FF00FF"
  32. android:text="@string/third" />
  33. <TextView
  34. android:id="@+id/fourthText"
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:background="#00FFFF"
  38. android:text="@string/fourth" />
  39. </LinearLayout>
  40. </LinearLayout>

所得效果如下:(注意每个TextView里面的android:layout_width和android:layout_height的属性值,有兴趣的可以试试不同的值显示的不同的效果)

这个布局中还有个android:layout_weight属性限定在水平布局时,不同的控件占的宽度比率,具体规则为:如果水平布局有两个控件,其android:layout_weight属性值分别为n和m,则属性值为n的控件所占的长度比例为总长的n/(n+m),属性值为m的控件所占的长度比例为m/(n+m);属性值越大,占的份额越多。

这里再演示一下,main.xml中四个控件分别加上android:layout_weight=“对应的数字”:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:orientation="horizontal" >
  10. <TextView
  11. android:id="@+id/firstText"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_weight="1"
  15. android:background="#FFFFFF"
  16. android:text="@string/first" />
  17. <TextView
  18. android:id="@+id/secondText"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_weight="2"
  22. android:background="#FFFF00"
  23. android:text="@string/second" />
  24. </LinearLayout>
  25. <LinearLayout
  26. android:layout_width="match_parent"
  27. android:layout_height="wrap_content"
  28. android:orientation="horizontal" >
  29. <TextView
  30. android:id="@+id/thirdText"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:layout_weight="3"
  34. android:background="#FF00FF"
  35. android:text="@string/third" />
  36. <TextView
  37. android:id="@+id/fourthText"
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:layout_weight="4"
  41. android:background="#00FFFF"
  42. android:text="@string/fourth" />
  43. </LinearLayout>
  44. </LinearLayout>

显示效果:

另外还能通过LinearLayout的android:gravity属性或者控件的android:layout_gravity属性,结合LinearLayout的android:orientation属性来设置水平或者垂直居中,这个可以自己多调试一下。

布局三:

表格布局TableLayout,更方便的展示N行N列的布局格式。TableLayout由许多TableRow组成,每个TableRow都代表一行。
  TableRow继承自LinearLayout,android:orientation="horizontal",android:layout_width=“match_parent”,android:layout_height =“wrap_content”。里面定义的控件都是横向排列,并且宽高一致的,相当于表格中的单元格,但是不能合并单元格。

看代码,layout/main.xml

  1. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TableRow
  6. android:layout_width="fill_parent"
  7. android:layout_height="wrap_content" >
  8. <TextView
  9. android:id="@+id/firstText"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_weight="1"
  13. android:background="#FFFFFF"
  14. android:text="@string/first" />
  15. <TextView
  16. android:id="@+id/secondText"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_weight="1"
  20. android:background="#FFFF00"
  21. android:text="@string/second" />
  22. </TableRow>
  23. <TableRow
  24. android:layout_width="fill_parent"
  25. android:layout_height="wrap_content" >
  26. <TextView
  27. android:id="@+id/thirdText"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_weight="1"
  31. android:background="#FF00FF"
  32. android:text="@string/third" />
  33. <TextView
  34. android:id="@+id/fourthText"
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:layout_weight="1"
  38. android:background="#00FFFF"
  39. android:text="@string/fourth" />
  40. </TableRow>
  41. </TableLayout>

效果图:(有兴趣的可以去掉android:layout_weight属性看看效果)

关于表格布局需要了解的还有:

android:stretchColumns某一列自动填充空白区域

android:shrinkColumns压缩某个列(用于内容过长,横向显示不完全,多余的往下自动扩展)

TableLayout的列序号从0开始

android:gravity设置对齐规则可以多个条件中间用|分开,比如android:gravity=“top|right”,注意|前后不能有空格

布局四:

单帧布局FrameLayout,理解起来最简单,所有的控件都不能指定位置,从左上角对齐依次叠加,后面的控件直接覆盖在前面的控件之上。为了清晰的显示出效果,这里使用两种不同的控件大小展示。

layout/main.xml代码:

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:background="#FFFFFF"
  10. android:text="@string/first" />
  11. <TextView
  12. android:id="@+id/secondText"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:background="#FFFF00"
  16. android:text="@string/second" />
  17. <TextView
  18. android:id="@+id/thirdText"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:background="#FF00FF"
  22. android:text="@string/third" />
  23. <TextView
  24. android:id="@+id/fourthText"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:background="#00FFFF"
  28. android:text="@string/fourth" />
  29. </FrameLayout>

显示效果:(因为second比fourth长那么一点点,所以露出来一点)

换个代码再演示一下main.xml

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:background="#FFFFFF"
  10. android:text="@string/first" />
  11. <TextView
  12. android:id="@+id/secondText"
  13. android:layout_width="200dp"
  14. android:layout_height="200dp"
  15. android:background="#FFFF00"
  16. android:text="@string/second" />
  17. <TextView
  18. android:id="@+id/thirdText"
  19. android:layout_width="100dp"
  20. android:layout_height="100dp"
  21. android:background="#FF00FF"
  22. android:text="@string/third" />
  23. <TextView
  24. android:id="@+id/fourthText"
  25. android:layout_width="50dp"
  26. android:layout_height="50dp"
  27. android:background="#00FFFF"
  28. android:text="@string/fourth" />
  29. </FrameLayout>

效果:

布局五:

绝对布局AbsoluteLayout,使用android:layout_x和android:layout_y属性来限定控件的位置,左上角坐标为(0,0),各控件位置可以重叠,实际开发中因为限定的位置太过死板而很少用到,实际上我使用的版本已经提示这个布局过期,不推荐使用,这里简单介绍一下。

layout/main.xml代码:

  1. <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/firstText"
  7. android:layout_x="50dp"
  8. android:layout_y="50dp"
  9. android:layout_width="50dp"
  10. android:layout_height="50dp"
  11. android:background="#FFFFFF"
  12. android:text="@string/first" />
  13. <TextView
  14. android:id="@+id/secondText"
  15. android:layout_x="80dp"
  16. android:layout_y="80dp"
  17. android:layout_width="50dp"
  18. android:layout_height="50dp"
  19. android:background="#FFFF00"
  20. android:text="@string/second" />
  21. <TextView
  22. android:id="@+id/thirdText"
  23. android:layout_x="120dp"
  24. android:layout_y="100dp"
  25. android:layout_width="50dp"
  26. android:layout_height="50dp"
  27. android:background="#FF00FF"
  28. android:text="@string/third" />
  29. <TextView
  30. android:id="@+id/fourthText"
  31. android:layout_x="180dp"
  32. android:layout_y="10dp"
  33. android:layout_width="50dp"
  34. android:layout_height="50dp"
  35. android:background="#00FFFF"
  36. android:text="@string/fourth" />
  37. </AbsoluteLayout>

效果:

布局到此为止,不同的布局之间还可以嵌套,大家有兴趣的话可以自己多尝试尝试。

页面的五种布局以及嵌套『Android系列八』的更多相关文章

  1. android五种布局模式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:LinearLayout (线性布局),FrameLayout(框架布局),AbsoluteLayout(绝对 ...

  2. 【Android 复习】:Android五种布局的使用方法

    ---恢复内容开始--- 在Android布局中,有五种常用的布局,下面我们就来学习一下这几种布局的使用方式 1) 线性布局:LinearLayout 2) 帧布局:  FrameLayout 3)  ...

  3. 【转】Android UI 五种布局

    在一个Android应用中,Layout是开发中的一个很重要环节,Layout是组成UI不可缺少的一部分. ## Android UI 核心类 在Android应用构建UI的方法有以下几种: 单纯使用 ...

  4. Android常用五种布局

    1. FrameLayout(框架布局) 这个布局可以看成是墙脚堆东西,有一个四方的矩形的左上角墙脚,我们放了第一个东西,要再放一个,那就在放在原来放的位置的上面,这样依次的放,会盖住原来的东西.这个 ...

  5. JSP页面的五种跳转方法

    ①RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Se ...

  6. web网页设计五种布局

    1.大框套小框布局   2.通栏布局   3.导航栏在主视觉下方的布局  4.左中右布局  5.环绕式布局

  7. PHP 页面跳转到另一个页面的几种方法分享

    如何在 PHP 中从一个页面重定向到另外一个页面呢?今天 清源 为大家列举出了三种办法,供大家来参考. 一.用HTTP头信息  也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向 ...

  8. CSS-三栏响应式布局(左右固宽,中间自适应)的五种方法

    代码: <!-- 1 float --> <h3 class="block">第一种方法-float</h3> <div class=&q ...

  9. 假设高度已知,请写出三栏布局,其中左栏、右栏各为300px,中间自适应的五种方法

    假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应的五种方法 HTML CSS 页面布局 题目:假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应 <!D ...

随机推荐

  1. 为什么阿里Java手册推荐慎用 Object 的 clone 方法来拷贝对象

    图片若无法显示,可至掘金查看https://juejin.im/post/5d425230f265da039519d248 前言 在阿里Java开发手册中,有这么一条建议:慎用 Object 的 cl ...

  2. 二叉树性质 n0=n2+1

    假设树的节点个数为n,那么n=n0+n1+n2,并且边的个数等于n-1,那么 n-1=n22+n1 则 n0+n1+n2-1=n22+n1,即n0=n2+1.

  3. Spring Boot 2.x 缓存应用 Redis注解与非注解方式入门教程

    Redis 在 Spring Boot 2.x 中相比 1.5.x 版本,有一些改变.redis 默认链接池,1.5.x 使用了 jedis,而2.x 使用了 lettuce Redis 接入 Spr ...

  4. JQuery选择器&过滤器

    JQuery对象: JQuery对象的本质上是DOM数组,它对DOM元素进行了封装 JQuery对象和JavaScript对象可以互转(\$()/$obj()[i]),但是JQuery对象和Javas ...

  5. linux与python3安装redis

    1.linux安装redis服务 apt-get install redis* 进入客户端管理 redis-cli 启动服务 service redis startservice redis rest ...

  6. Catalyst 3850 升级-1

    Cisco Catalyst 3850交换机使用Cisco IOS XE软件. Cisco IOS XE软件是一个包含一组包文件的一个集合. 我们可以使用以下两种模式之一在Cisco Catalyst ...

  7. AireOS WLC配置抓包

    这个Note主要列举在AireOS WLC上如何抓包.它实现的步骤也相对比较简单: 1.开启debug packet, 2.有数据被抓取到时,会以16进制的形式在WLC上输出, 3.我们将输出信息保存 ...

  8. mysql_pw 指令 数据库创建过程

    ------------------pw_db数据库创建过程各表创建指令-------------------------- create database pw_db; #创建一个数据库use pw ...

  9. ANSYS初始残余应力赋值

    目录 1.建模 2.划分网格并分组 3.所有节点固定约束 4.施加初始残余应力 5.结果 1.建模 建立有限元模型,采用SOLID185单元,模型尺寸0.050.050.02 材料为钢 !程序头 FI ...

  10. iPhone代工商,谁敢要求苹果赔偿损失?

    据外国媒体报道,苹果的首席设计师已准备离职,有相关评论称:库克已经不在把硬件设计放到第一位,整个团队都巧妙地遭遇降级.相信熟悉苹果组织的人都知道,他们一切的核心都是围绕"硬件设计" ...