文章目录
Ch 2 Android常见界面布局
2.1 View视图
ViewGroup 和 View 控件的包含关系
Android应用的每个界面的根元素必须有且只有一个ViewGroup容器。
2.2 界面布局编写方式
2.2.1 在XML文件中编写布局
Android可以使用XML布局文件控制界面布局,从而有效地将界面中布局的代码和Java代码分离,使程序的结构更加清晰。
2.2.2 在Java代码中编写布局
在Android中所有布局和空间的对象都可以通过new关键字创建出来,将创建的View控件添加到ViewGroup布局中,从而实现View控件在布局界面中显示。
不管使用哪种方式编写布局,它们控制Android用户界面行为的本质是完全一样的。
2.3 常见界面布局
2.3.1 布局的通用属性
Android系统提供的五种常用布局直接或间接继承自ViewGroup,因此也常用布局支持在ViewGroup中定义的属性。
- android:id
用于设置当前布局的唯一标识。通过"@+id/属性名称
"定义。
在R.java
文件中会自动生成对应的int值。在Java代码中通过为findViewById()
方法传入该int值来获取该布局对象。 - android:layout_width
用于设置布局宽度fill_parent
: 该布局宽度与父容器宽度相同。match_parent
:与fill_parent
相同,Android2.2开始推荐使用。match_parent
wrap_content
:该布局宽度恰好能包裹内容。
- android:layout_heigh
用于设置布局高度fill_parent
: 该布局宽度与父容器高度相同。match_parent
:与fill_parent
相同,Android2.2开始推荐使用。match_parent
wrap_content
:该布局高度恰好能包裹内容。
- android:background
用于设置布局背景。 - android:layout_margin
用于设置当前布局与屏幕边界、周围布局或控件的距离。- android:layout_marginTop
- android:layout_marginBottom
- android:layout_marginLeft
- android:layout_marginRight
- android:layout_padding
用于设置当前布局内控件与该布局的距离。- android:layout_paddingTop
- android:layout_paddingBottom
- android:layout_paddingLeft
- android:layout_paddingRight
Android系统提供的五种常用布局必须设置
android:layout_width
和android:layout_height
。
2.3.2 RelativeLayout相对布局
RelativeLayout通过相对定位的方式指定子控件的位置。
定义格式:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
属性 = "属性值"
......>
</RelativeLayout>
Relativelayout中子控件属性
属性名称 | 功能描述 |
---|---|
android:layout_centerInParent | 设置当前控件位于父布局的中央位置 |
android:layout_centerVertical | 设置当前控件位于父布局的垂直居中位置 |
android:layout_centerHorizontal | 设置当前控件位于父布局的水平居中位置 |
android:layout_above | 设置当前控件位于某控件上方 |
android:layout_below | 设置当前控件位于某控件下方 |
android:layout_toLeftOf | 设置当前控件位于某控件左侧 |
android:layout_toRightOf | 设置当前控件位于某控件右侧 |
android:layout_alignParentTop | 设置当前控件是否与父控件顶端对齐 |
android:layout_alignParentLeft | 设置当前控件是否与父控件左端对齐 |
android:layout_alignParentRight | 设置当前控件是否与父控件右端对齐 |
android:layout_alignParentBottom | 设置当前控件是否与父控件底端对齐 |
android:layout_alignTop | 设置当前控件的上边界与某控件的上边界对齐 |
android:layout_alignBottom | 设置当前控件的下边界与某控件的下边界对齐 |
android:layout_alignLeft | 设置当前控件的左边界与某控件的左边界对齐 |
android:layout_alignRight | 设置当前控件的右边界与某控件的右边界对齐 |
在Relativelayout布局中定义的控件默认与父布局左上角对齐。
布局和控件的宽高
为了让Android程序拥有更好的屏幕适配能力,在设置控件和布局宽高时最好使用
match_parent
或wrap_content
。
2.3.3 LinearLayout线性布局
LinearLayout通常指定布局内的子空间水平或竖直排列。
定义格式:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
属性 = "属性值"
......>
</LinearLayout>
- 属性说明
- android:orientation
用于设置LinearLayout布局中控件的排列顺序,可选vertical
和horizontal
。 - android:weight
通过设置权重使布局内的控件按照权重比显示大小,在进行屏幕适配时起关键作用。
- android:orientation
- 为控件分配权重
略
LinearLayout布局中的
android:layout_width
不可设为warp_content
,因为LinearLayout优先级比Botton高,如果设置warp_content
,则Button控件的android:layout_weight
会失去作用。设置了Button控件的android:layout_weight
属性时,控件的android:layout_width
一般设置为0dp才会有权重占比效果。
2.3.4 TableLayout表格布局
TableLayout采用行、列的形式来管理控件。通过在TableLayout布局中添加TableRow布局或控件来控制表格行数,在TableRow布局中添加控件来控制表格列数。
XML布局文件中定义表格布局基本语法格式:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
属性 = "属性值">
<TableRow>
UI控件
</TableRow>
UI控件
......
</TableLayout>
TableLayout继承自LinearLayout,因此完全支持LinearLayout所支持的属性。
TableLayout布局常用属性
属性名称 | 功能描述 | 例子 |
---|---|---|
android:stretchColumns | 设置可被拉伸的列 | ="0"表示第1列可被拉伸 |
android:shrinkColumns | 设置可被收缩的列 | ="1,2"表示2,3列可被收缩 |
android:collapseColumns | 设置可被隐藏的列 | ="0"表示第1列可被隐藏 |
TableLayout布局中控件常用属性 | ||
属性名称 | 功能描述 | 例子 |
--------------------- | ----------------------------- | ------------------------ |
android:layout_column | 设置该控件显示的位置 | ="1"表示在第二个位置显示 |
android:layout_span | 设置该控件占据几行,默认为1行 | |
###2.3.5 FrameLayout帧布局 | ||
FrameLayout用于在屏幕上创建一块空白区域,添加到该区域中的每个子控件占一帧。后加入的控件会叠加在上一个控件上层。默认情况下,帧布局中的所有控件会与左上角对齐。 | ||
XML布局文件中定义FrameLayout基本语法格式: |
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
属性 = "属性值">
</FrameLayout>
FrameLayout属性
属性名称 | 功能描述 |
---|---|
android:foreground | 设置帧布局容器的前景图像(始终在所有子控件之上) |
android:foregroundGravity | 设置前景图像显示的位置 |
2.3.6 ConstraintLayout约束布局
ConstraintLayout是Android Studio2.2新添加的布局。ConstrainLayout并不太适合使用XML代码的方式编写布局,但非常适合使用可视化的方式编写界面布局
-
相对定位
一个空间相对于另一个空间进行定位。ConstrainLayout布局中的控件可以在横向和纵向上以添加约束关系的方式进行相对定位。- 横向:left、start、right、end
- 纵向:top、bottom、baseline(文本底部基准线)
相对定位关系的属性
属性名称 功能描述 layout_constraintLeft_toLeftOf 控件左边与另一个控件的左边对齐 layout_constraintLeft_toRightOf 控件左边与另一个控件的右边对齐 layout_constraintRight_toLeftOf 控件右边与另一个控件的左边对齐 layout_constraintRight_toRightOf 控件右边与另一个控件的右边对齐 layout_constraintTop_toTopOf 控件上边与另一个控件的上边对齐 layout_constraintTop_toBottomOf 控件上边与另一个控件的底部对齐 layout_constraintBaseline_toBaselineOf 控件间的文本内容基准线对齐 layout_constraintStart_toEndOf 控件的起始边与另外一个控件的尾部对齐 layout_constraintStart_toStartOf 控件的起始边与另外一个控件的起始边对齐 layout_constraintEnd_toStartOf 控件的尾部与另外一个控件的起始边对齐 layout_constraintEnd_toEndOf 控件的尾部与另外一个控件的尾部对齐 -
居中定位和倾向
控件可以通过添加约束的方式确定该控件在父布局中的相对位置。当相同方向上,控件两边同时向ConstraintLayout添加约束,则控件在添加约束的方向上居中显示。
两个约束的力大小不等时,就会产生倾向
倾向的属性属性名称 功能描述 layout_constraintHorizontal_bias 横向的倾向 layout_constraintVertical_bias 纵向的倾向 如果ConstraintLayout布局中的控件在居中方向上和父布局的尺寸一致,此时该方向的居中约束和倾向没有意义。
-
Chain
Chain是一种特殊的约束。它使我们能够对一组水平或垂直方向上互相关联的控件进行统一管理。一组控件通过一个双向的约束关系链接起来,就能形成一个Chain。
Chain中第一个控件成为头控件,头控件可以通过layout_constraintHorizontal_chainStyle
和layout_constraintVertical_chainStyle
属性设置水平链条和竖直链条的样式- spread:设置控件在布局内均匀分布。
- spread_insid:设置两端的控件与父布局无间距显示,其他的控件将在剩余的空间内采用spread样式进行布局
- packed:设置Chain中的所有控件合并在一起后在布局内居中显示。
当控件
宽
或高
设置为0dp时,Chain的3种样式可以配合layout_constraintHorizontalweight
形成Weighted Chain的样式。
packed
可以搭配layoutconstraintHorizontal_bias
控制Chain与父容器的间距从而形成packed Chain With Bias样式。