Android应用界面编程--布局管理器

目录

 

简介

相对布局(RelativeLayout)  

线性布局(LinearLayout)

表格布局(TableLayout)

帧布局(FrameLayout)

绝对布局

简单的一个布局


目录

 

简介

相对布局(RelativeLayout)  

线性布局(LinearLayout)

表格布局(TableLayout)

帧布局(FrameLayout)

绝对布局

简单的一个布局

简介

在介绍Android的布局管理器之前,有必要让了解Android平台下的控件类。首先要了解的是View类,该类为所有可视化控件的基类,主要提供了控件绘制和事件处理的方法。创建用户界面所使用的控件都继承自View,如TextView、Button、CheckBox等。

关于View及其子类的相关属性,既可以在布局XML文件中进行设置,也可以通过成员方法在代码中动态设置。View类常用的属性及其对应方法如表1所示。

表1  View类常用属性及对应方法说明

属 性 名 称

对 应 方 法

描    述

android:background

setBackgroundResource(int)

设置背景

android:clickable

setClickable(boolean)

设置View是否响应单击事件

android:visibility

setVisibility(int)

控制View的可见性

android:focusable

setFocusable(boolean)

控制View是否可以获取焦点

android:id

setId(int)

为View设置标识符,可通过findViewById方法获取

android:longClickable

setLongClickable(boolean)

设置View是否响应长单击事件

android:soundEffectsEnabled

setSoundEffectsEnabled(boolean)

设置当View触发单击等事件时是否播放音效

android:saveEnabled

setSaveEnabled(boolean)

如果未做设置,当View被冻结时将不会保存其状态

android:nextFocusDown

setNextFocusDownId(int)

定义当向下搜索时应该获取焦点的View,如果该View不存在或不可见,则会抛出RuntimeException异常

android:nextFocusLeft

setNextFocusLeftId(int)

定义当向左搜索时应该获取焦点的View

android:nextFocusRight

setNextFocusRightId(int)

定义当向右搜索时应该获取焦点的View

android:nextFocusUp

setNextFocusUpId(int)

定义当向上搜索时应该获取焦点的View,如果该View不存在或不可见,则会抛出RuntimeException异常

 

说明:任何继承自View的子类都将拥有View类的以上属性及对应方法。

android:layout_gravity:是用于指定控件在布局中的对齐 方 式 。 android:layout_gravity 的 可 选 值 和 android:gravity 差 不 多 , 但 是 需 要 注 意 , 当 LinearLayout 的排列方向是 horizontal 时,只有垂直方向上的对齐方式才会生效,因为此时水 平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定 该方向上的对齐方式。同样的道理,当 LinearLayout 的排列方向是 vertical 时,只有水平方 向上的对齐方式才会生效。

android:layout_weight:指定该子组件的布局宽度度。

这个属性允许我们使用比例的方式来指定控件的大小。形容的是本view和父容器的关系;而view中的width是用来描述自己本身的。用来分配空间大小。

android:layout_height:指定该子组件的高度。

 

相对布局(RelativeLayout)  

顾名思义是有参照的,就是以某个兄弟组件,或者父容器来决定的(兄弟组件是在一个同一个布局里面的组件,如果是布局里一个组件参照另一个布局里的组件会出错)。合理地利用好LinearLayout的weight权重属性和RelativeLayout相 对布局,可以解决屏幕分辨率不同的自适应问题。

在相对布局中,子控件的位置是相对兄弟控件或父容器而决定的。出于性能考虑,在设计相对布局时要按照控件之间的依赖关系排列,如View A的位置相对于View B来决定,则需要保证在布局文件中View B在View A的前面。

在进行相对布局时用到的属性很多,首先来看属性值只为true或false的属性,如表2所示。

 

表2  相对布局中只取true或false的属性

属 性 名 称

属 性 说 明

android:layout_centerHorizontal

当前控件位于父控件的横向中间位置

android:layout_centerVertical

当前控件位于父控件的纵向中间位置

android:layout_centerInParent

当前控件位于父控件的中央位置

android:layout_alignParentBottom

当前控件底端与父控件底端对齐

android:layout_alignParentLeft

当前控件左侧与父控件左侧对齐

android:layout_alignParentRight

当前控件右侧与父控件右侧对齐

android:layout_alignParentTop

当前控件顶端与父控件顶端对齐

android:layout_alignWithParentIfMissing

参照控件不存在或不可见时参照父控件

 

 接下来再来看属性值为其他控件id的属性,如表3所示。

 

表3  相对布局中取值为其他控件id的属性及说明

属 性 名 称

属 性 说 明

android:layout_toRightOf

使当前控件位于给出id控件的右侧

android:layout_toLeftOf

使当前控件位于给出id控件的左侧

android:layout_above

使当前控件位于给出id控件的上方

android:layout_below

使当前控件位于给出id控件的下方

android:layout_alignTop

使当前控件的上边界与给出id控件的上边界对齐

android:layout_alignBottom

使当前控件的下边界与给出id控件的下边界对齐

android:layout_alignLeft

使当前控件的左边界与给出id控件的左边界对齐

android:layout_alignRight

使当前控件的右边界与给出id控件的右边界对齐

 

最后要介绍的是属性值以像素为单位的属性及说明,如表4所示。

 

表4  相对布局中取值为像素的属性及说明

属 性 名 称

属 性 说 明

android:layout_marginLeft

当前控件左侧的留白

android:layout_marginRight

当前控件右侧的留白

android:layout_marginTop

当前控件上方的留白

android:layout_marginBottom

当前控件下方的留白

 

需要注意的是在进行相对布局时要避免出现循环依赖,例如设置相对布局在父容器中的排列方式为WRAP_CONTENT,就不能再将相对布局的子控件设置为ALIGN_PARENT_ BOTTOM。因为这样会造成子控件和父控件相互依赖和参照的错误。

 

线性布局(LinearLayout)

提供了控件水平或者垂直排列的模型。同时,使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。LinearLayout布局的属性既可以在布局文件(XML)中设置,也可以通过成员方法进行设置。表5给出了LinearLayout常用的属性及这些属性的对应设置方法。

表5 LinearLayout常用属性及对应设置方法

属 性 名 称

对 应 方 法

描    述

android:orientation

setOrientation(int)

设置线性布局的朝向,可取horizontal和vertical两种排列方式

android:gravity

setGravity(int)

设置线性布局的内部元素的布局方式

 

在线性布局中可使用gravity属性来设置控件的对齐方式,gravity可取的属性值及说明如表6所示。

提示:当需要为gravity设置多个值时,用“|”分隔即可。

 

表6  gravity可取的属性值及说明

属  性  值

说    明

top

不改变控件大小,对齐到容器顶部

bottom

不改变控件大小,对齐到容器底部

left

不改变控件大小,对齐到容器左侧

right

不改变控件大小,对齐到容器右侧

center_vertical

不改变控件大小,对齐到容器纵向中央位置

center-horizontal

不改变控件大小,对齐到容器横向中央位置

center

不改变控件大小,对齐到容器中央位置

fill_vertical

若有可能,纵向拉伸以填满容器

fill_horizontal

若有可能,横向拉伸以填满容器

fill

若有可能,纵向横向同时拉伸以填满容器

 

 

表格布局(TableLayout)

以行和列的形式管理控件,每行为一个TableRow对象,也可以为一个View对象,当为View对象时,该View对象将跨越该行的所有列。在TableRow中可以添加子控件,每添加一个子控件为一列。

TableLayout继承自LinearLayout类,除了继承来自父类的属性和方法, TableLayout类中还包含表格布局所特有的属性和方法。这些属性和方法说明如表7所示。

 

表7  TableLayout类常用属性及对应方法说明

属 性 名 称

对 应 方 法

描    述

android:collapseColumns

setColumnCollapsed(int,boolean)

设置指定列号的列为Collapsed,列号从0开始计算

android:shrinkColumns

setShrinkAllColumns(boolean)

设置指定列号的列为Shrinkable,列号从0开始计算

android:stretchColumns

setStretchAllColumns(boolean)

设置指定列号的列为Stretchable,列号从0开始计算

 

说明:setShrinkAllColumns和setStretchAllColumns实现的功能是将表格中的所有列设置为Shrinkable或Stretchable。

 

帧布局(FrameLayout)

FrameLayout帧布局在屏幕上开辟出了一块区域,在这块区域中可以添加多个子控件,但是所有的子控件都被对齐到屏幕的左上角。帧布局的大小由子控件中尺寸最大的那个子控件来决定。如果子控件一样大,同一时刻只能看到最上面的子控件。

FrameLayout继承自ViewGroup,除了继承自父类的属性和方法,FrameLayout类中包含了自己特有的属性和方法,如表8所示。

表8  FrameLayout属性及对应方法

属 性 名 称

对 应 方 法

描    述

android:foreground

setForeground(Drawable)

设置绘制在所有子控件之上的内容

android:foregroundGravity

setForegroundGravity(int)

设置绘制在所有子控件之上内容的gravity属性

 

 提示:在FrameLayout中,子控件是通过栈来绘制的,所以后添加的子控件会被绘制在上层。

 

绝对布局

绝对定位AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。

 

简单的一个布局

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    tools:context="cn.com.buildwin.gosky.activities.PreviewActivity">

 

    <!--背景、视频播放界面、进度条-->

    <FrameLayout

        android:layout_width="match_parent"

        android:layout_height="match_parent">

 

        <cn.com.buildwin.gosky.widget.media.IjkVideoView

            android:id="@+id/video_view"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:background="#000000"

            android:layout_gravity="center" />

 

        <ProgressBar

            android:id="@+id/progressBar"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center"/>

 

    </FrameLayout>

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true">

 

        <Button

            android:id="@+id/take_picture_button"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="拍照"/>

 

    </LinearLayout>

 

</RelativeLayout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值