目录
目录
简介
在介绍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>