第八章 Android 开发常见的UI布局

   Android 实际开发过程中,要想你设计的界面美观,布局的合理利用还是不能少的。一个复杂的页面,由繁化简的过程就是对布局页面的合理利用。之前讲过了基础控件,在布局中,嵌套基础控件是开发页面的基础。
  Android 常见的UI布局包括了:线性布局(LinearLayout),帧布局(FrameLayout),表格布局(TableLayout),相对布局(RelativeLayout).有时还有绝对布局(AbsoluteLayout)这个布局界面代码太刚性,不建议采纳。

1.AbsoluteLayout 绝对布局

  为什么我们在开发过程中不建议采纳AbsoluteLayout这个绝对布局呢?因为我们知道界面设计是在二维的平面上进行的。起点在屏幕的左上角(0,0)。以此为起点向右和向下递增。在此布局中,所有的子控件允许重叠。那么可能出现控件重叠被覆盖的情况,所以实际开发过程中,通常不采用这样的布局。

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
    <TextView android:layout_width="50dp" android:layout_height="50dp" android:background="#ff521225" android:gravity="center" android:layout_x="50dp" android:layout_y="50dp" android:text="1"/>
    <TextView android:layout_width="50dp" android:layout_height="50dp" android:background="#ff654321" android:gravity="center" android:layout_x="25dp" android:layout_y="25dp" android:text="2"/>
    <TextView  android:layout_width="50dp" android:layout_height="50dp" android:background="#fffedcba" android:gravity="center" android:layout_x="125dp" android:layout_y="125dp" android:text="3"/>
</AbsoluteLayout>

这里有三个TextView控件,显示效果为:

绝对布局

控件1 被遮挡了。

2.线性布局

2.1 android :orientation 设置方向

  线性布局是我们在实际开发过程中使用频率较高的布局。顾名思义,线性布局的子控件在布局的时候只能成线状横向或者竖向排列。可以通过 android:orientation 属性指定布局方向。

//竖向排列
android:orientation="vertical"   
//横向排列
android:orientation="horizontal"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:orientation="horizontal"
    android:gravity="center"
  >
    <TextView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="1"
        android:textSize="20sp"
        android:background="#f00"
        android:textColor="#fff"
        android:gravity="center"
        android:layout_margin="10dp"/>

    <TextView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="1"
        android:textSize="20sp"
        android:background="#f00"
        android:textColor="#fff"
        android:gravity="center"
        android:layout_margin="10dp"/>

    <TextView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="1"
        android:textSize="20sp"
        android:background="#f00"
        android:textColor="#fff"
        android:gravity="center"
        android:layout_margin="10dp"/>
</LinearLayout>
线性布局横向排列
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:orientation="vertical"
    android:gravity="center"
  >
...
</LinearLayout>
线性布局横向排列

2.2 android:layout_weight 设置 权重

  在实际开发过程中,你的控件所占的宽高不一定需要固定的数值,例如在android:orientation="horizontal" 的情况下,不同的屏幕手机适配是不一样的,你需要的仅仅是横向排满就好了。这时候使用 android:layout_weight 属性就特别的方便。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:orientation="vertical"
    android:gravity="center"
  >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:background="#0f0">
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="50dp"
            android:text="1"
            android:textSize="20sp"
            android:background="#f00"
            android:textColor="#fff"
            android:gravity="center"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
           />

        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="50dp"
            android:text="1"
            android:textSize="20sp"
            android:background="#f00"
            android:textColor="#fff"
            android:gravity="center"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
          />

        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="50dp"
            android:text="1"
            android:textSize="20sp"
            android:background="#f00"
            android:textColor="#fff"
            android:gravity="center"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
          />
    </LinearLayout>
</LinearLayout>
线性布局的权重

设置权重的时候,将你需要设置的控件的宽度或者高度设置为0dp,这样就会自动帮你占满。
如果你只将其中一个设置 android:layout_weight="1",其他的没有设置,那么它会将除了其他控件占的位置以外的空白处占据。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:orientation="vertical"
    android:gravity="center"
  >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:background="#0f0">
        <TextView
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:text="1"
            android:textSize="20sp"
            android:background="#f00"
            android:textColor="#fff"
            android:gravity="center"
           />

        <TextView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="1"
            android:textSize="20sp"
            android:background="#0f0"
            android:textColor="#fff"
            android:gravity="center"
          />

        <TextView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="1"
            android:textSize="20sp"
            android:background="#00f"
            android:textColor="#fff"
            android:gravity="center"
          />
    </LinearLayout>
</LinearLayout>
线性布局的权重

3. 相对布局

  相对布局,顾名思义,位置都是以某一个参照点为标准,设置它的相对位置。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp" >
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="name" />

    <TextView
        android:layout_width="96dp"
        android:layout_height="50dp"
        android:layout_below="@id/name"
        android:text="GONE"
        android:background="#0093ff"
        android:gravity="center"
        android:layout_alignParentLeft="true"
        />
    <Button
        android:layout_width="96dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/name"
        android:layout_alignParentRight="true"
        android:text="DONE" />
</RelativeLayout>
相对布局

3.1相对布局的基本属性

3.1.1 id 的使用

  给控件设置id,是为了在代码中能引用到,所以创建控件的id格式为: android :id ="@+id/自己设置id的名称",
  实际使用的时候,有时候可能会需要引用该控件。这时候你需要的是得到该id的值,再引用例如: android : layout_below="@id/引用的id的名称".

  <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="name" />

 <TextView
        android:layout_width="96dp"
        android:layout_height="50dp"
        android:layout_below="@id/name"
        android:text="GONE"
        android:background="#0093ff"
        android:gravity="center"
        android:layout_alignParentLeft="true"
        />
3.1.2 相对位置属性
//在父布局居中显示
android:layout_centerInParent="true"
//水平居中
android:layout_centerHorizontal="true"
//垂直居中
android:layout_centerVertical="true"

//在某个控件的下面
android:layout_below="@id/btn1"
// 在某个控件的上面
android:layout_above="@id/btn1"
//位于父布局的右边
android:layout_alignParentRight="true"
//位于父布局的左边
  android:layout_alignParentLeft="true"
//位于父布局的顶部
android:layout_alignParentTop="true"
//位于父布局的底部
android:layout_alignParentBottom="true"

4. 表格布局

  表格布局使用于多行多列的布局格式,每个TableLayout是由多个TableRow组成,一个TableRow就表示TableLayout中的每一行,这一行可以由多个子元素组成。实际上TableLayout和TableRow都是LinearLayout的子类。但是TableRow的参数android:orientation属性值固定为horizontal,android : layout_width = MATCH_PARENT,android : layout_height = WRAP_CONTENT。所以TableRow实际是一个横向的线性布局,且所以子元素宽度和高度一致。注意:在TableLayout中,单元格可以为空,但是不能跨列,意思是不能有相邻的单元格为空。在TableLayout布局中,一列的宽度由该列中最宽的那个单元格指定,而该表格的宽度由父容器指定。可以为每一列设置以下属性:
Shrinkable 表示该列的宽度可以进行收缩,以使表格能够适应父容器的大小
Stretchable 表示该列的宽度可以进行拉伸,以使能够填满表格中的空闲空间
Collapsed 表示该列会被隐藏
TableLayout中的特有属性:
android:collapseColumns
android:shrinkColumns
android:stretchColumns = "0,1,2,3"// 表示产生4个可拉伸的列

    android:shrinkColumns="0,1,2"  // 设置三列都可以收缩    
    android:stretchColumns="0,1,2" // 设置三列都可以拉伸 如果不设置这个,那个显示的表格将不能填慢整个屏幕  
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:shrinkColumns="0,1,2"
    android:stretchColumns="0,1,2"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button 
            android:gravity="center"
            android:padding="10dp"
            android:text="Button1"/>
     

        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button2">
        </Button>
        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button3">
        </Button>
    </TableRow>
    <TableRow android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button4">
        </Button>

        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button5">
        </Button>
    </TableRow>
    <TableRow android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button6">
        </Button>
        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button7">
        </Button>
        <Button android:gravity="center"
            android:padding="10dp"
            android:text="Button8">
        </Button>
    </TableRow>
</TableLayout>

表格布局

5.帧布局

  帧布局,也可以说是层次布局。在这个布局中,整个界面被当成一块空白备用区域,所有的子元素都不能被指定放置的位置,它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。如下,第一个Button被第二个Button完全遮挡,第三个Button遮挡了第二个Button的部分位置。

<?xml version="1.0" encoding="utf-8"?>
<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="50dp"
        android:layout_height="50dp"
        android:gravity="center" 
        android:text="按钮1"/>
    <Button
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:gravity="center" 
        android:text="按钮2"/>
    <TextView 
        android:layout_width="100dp" 
        android:layout_height="100dp" 
        android:gravity="center" 
        android:background="#f52f5f"
        android:text="按钮3"/>
</FrameLayout>
帧布局

帧布局的定位方式欠缺,所以实际应用场景比较少。

6.百分比布局

  在LinearLayout布局中,支持layout_weight 属性实现按比例指定控件大小。别的布局不支持,如果在RelativeLayout的布局中实现两个按钮平分布局宽度的效果比较困难。为此Android 引入了全新的百分比布局,解决这样的问题,使用起来也很简单。
  由于LinearLayout 已经可以处理按比例指定控件的大小。所以百分比布局只为了FrameLayout和 RelativeLayout 这两个提供了 PercentFrameLayout和PercentRelativeLayout这两个全新的布局方式。下面是使用的步骤

1.打开 build.gradle 文件,在dependencies闭包中加上 compile 'com.android.support:percent:25.3.1' ,后面的版本号可按照自己的版本号写。添加完了之后 sync now一下。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
     compile 'com.android.support:percent:25.3.1'
    testCompile 'junit:junit:4.12'
}

2.创建一个layout文件,最外层使用PercentFrameLayout ,这个布局不是系统自带的布局需要把完整的路径写出来,所以还要加一个 xmlns:app="http://schemas.android.com/apk/res-auto" 然后添加四个button 控件,引用 app:layout_widthPercent="50%",app : layout_heightPercent = "50%"来设置它所占的布局的百分比。

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button 
        android:id="@+id/btn01"
        android:text="Button01"
        android:layout_gravity="left|top"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"/>
    <Button
        android:id="@+id/btn02"
        android:text="Button02"
        android:layout_gravity="right|top"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"/>   
    <Button
    android:id="@+id/btn03"
    android:text="Button03"
    android:layout_gravity="left|bottom"
    app:layout_widthPercent="50%"
    app:layout_heightPercent="50%"/>   
    <Button
    android:id="@+id/btn04"
    android:text="Button04"
    android:layout_gravity="right|bottom"
    app:layout_widthPercent="50%"
    app:layout_heightPercent="50%"/>
</android.support.percent.PercentFrameLayout>
百分比布局
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,340评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,357评论 25 707
  • Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是: LinearLayou...
    枫羽望空阅读 9,631评论 1 9
  • 2016年6月的时候突然觉得自己应该做点儿什么,我想我不能再这么下去了。好在自己醒悟的不算晚,否则就真完蛋了。 现...
    亮仔少爷阅读 203评论 1 0
  • 想给你以冬日的温煦 我却不是太阳 想给你以夏日的清爽 我却不是微风
    李超_ed5f阅读 198评论 0 0