Android 布局文件的控制
布局文件的作用:控制想要显示在屏幕上的每一个控件的显示位置 View和ViewGroup:
Android中大部分的系统类都是View的子类,这些子类可以统称为android控件 在View中有一个特殊的子类ViewGroup,
当写布局文件的时候,一般规律为:在布局文件根标签中选择一个ViewGroup类型或者VIewGroup的子类类型,
在此标签的开始标签和结尾标签之间添加其他的View类型的标签.
结合结构关系图,布局文件的使用规律为:定义一个根标签为LinearLayout或其他,在LinearLayout的开始标签和结尾标签之间根据页面显示需求添加Button,TextView等控件
ViewGroup中有几个常用的子类,这几个常用子类有一个高大上的名字:Android 常用布局
Android常用布局:
- 1. LinearLayout 线性布局
- 2. RelativeLayout 相对布局
- 3. FrameLayout 帧布局,空白布局
- 4. GridLayout 网格布局
- 5. AbsoluteLayout 绝对布局(不大推荐使用)
LinearLayout 线性布局
所有被放在LinearLayout的开始标签和皆为标签之间的控件都称为该LinearLayout的子控件
在LinearLayout中的所有子控件只能按照横向或者竖向的一条直线排列,超出屏幕部分不显示
常用属性:
1.关于控件宽高的控制: (此两条属性为控件标签中必不可少的属性)
android:layout_width=""
android:layout_height="" 用于设置当前控件显示的宽高
属性值的设置方式:
1. fill_parent或者match_parent 填充父控件,即与父控件同宽(高)
2. wrap_content 自适应大小,即控件中要显示的内容有多宽多高,控件最终的显示宽高就有多少
3. 直接写数字+单位,如 100dp
2.关于排列方向的控制:
android:orientation="vertical" 指定排列方向,vertical 竖向排列, horizontal 横向排列
3. 关于控件间距的控制:
设置控件外间距的属性:
android:layout_margin 同时设置上下左右4个方向的外边距
android:layout_marginLeft="" 左边距
android:layout_marginTop="" 上边距
android:layout_marginRight="" 右边距
android:layout_marginBottom="" 下边距
设置内间距的属性:
android: padding 同时设置4个方向的内边距
android: paddingLeft 左侧内边距
android: paddingTop 上侧内边距
android: paddingRight 右侧内边距
android: paddingBottom 底部内边距
内边距与外边距的区别在于: 外边距设置的是控件与父控件之间的间距或者说其他兄弟控件的间距,如设置的是红色区域与整体屏幕的上间距
内边距设置的是控件中的内容距离控件范围边缘的间距
设置控件特殊的显示位置(靠右,居中等):
android:layout_gravity
使用此条属性时注意:此条属性有一个系统默认的问题:
当位于垂直的线性布局中,任何与高度(垂直)相关的属性都会失效,如:bottom,center_vertical等
当位于水平的线性布局中,任何与宽度(水平)相关的属性都会失效,如:right,center_horizontal等
原因:以垂直的线性布局为例,官方认为,在此布局中可以从上到下放置无限个子控件,虽然超出屏幕的部分无法显示,但是依然存在,程序不会报错
android:gravity 与android:layout_gravity的区别:
android:layout_gravity 控制的是当前控件在父控件范围内所处的位置
android:gravity 控制的是当前控件中的内容在控件宽高范围内所处的位置
关于控件权重的控制:
android:layout_weight 权重 设置当前控件占据剩余空间的几分之几的内容
android:weightSum 权重总和 (可省略不设置)
RelativeLayout 相对布局
所有控件的默认位置都是左上角,如果要自定义控件位置的话,位置都需要相对于其他控件完成,
如:有控件A,B,C A的位置左上角, B位于屏幕右下角, C位于A的右下方
给相对布局的子控件使用的常用属性:
1. 以父控件为参照物,紧贴父控件的某边缘或者在父控件范围内居中
属性值填写:true或false, 写false的话效果与没写此条属性时效果相同
android:layout_alignParentLeft="" 紧贴父控件左边缘
android:layout_alignParentTop=""紧贴父控件顶边缘
android:layout_alignParentRight=""紧贴父控件右边缘
android:layout_alignParentBottom=""紧贴父控件底边缘
android:layout_centerHorizontal=""在父控件范围内水平居中
android:layout_centerVertical="" 在父控件范围内垂直居中
android:layout_centerInParent=""在父控件范围内完全居中
给控件设置唯一标识的方式:给控件添加android:id属性,在属性值中添加@+id/自定义名称
注意:当同一个布局文件中,控件和控件之间的id不能重复,但是如果在不同布局文件中,id可以重复
2.相对于兄弟控件,位于兄弟控件的上下左右位置
属性值的填写:填写的是作为参照物的兄弟控件唯一标识
android:layout_above="@+id/dhj" 设置当前控件位于指顶控件的上方控件弟控件,与兄弟控件的平齐位置,如左边云件完成,如:有空间
android:layout_below="@+id/dhj" 设置当前控件位于指顶控件的下方控件弟控件,与兄弟控件的平齐位置,如左边云件完成,如:有空间
android:layout_toLeftOf="@+id/dhj" 设置当前控件位于指顶控件的左侧控件弟控件,与兄弟控件的平齐位置,如左边云件完成,如:有空间
android:layout_toRightOf="@+id/dhj" 设置当前控件位于指顶控件的右侧控件弟控件,与兄弟控件的平齐位置,如左边云件完成,如:有空间
3.相对于兄弟控件,与兄弟控件的平齐位置,如左边缘平齐等效果
属性值的填写:填写的是作为参照物的兄弟控件唯一标识
android:layout_alignLeft="" 设置当前控件的与指定控件左边缘平齐
android:layout_alignTop="" 设置当前控件的与指定控件顶边缘平齐
android:layout_alignRight="" 设置当前控件的与指定控件右边缘平齐
android:layout_alignBottom="" 设置当前控件的与指定控件底边缘平齐
android:layout_alignBaseline="" 设置当前控件的与指定控件基准线平齐
FrameLayout 帧布局
通常情况下,会结合Fragment进行使用,单独使用情况不多
特点:
1. 所有控件位置默认左上角
2. 类似photoshop,每一个控件占据一个图层,即如果同时添加多个控件,那么这多个控件是重叠覆盖在一起的
如果需要控制控件位置:android:layout_gravity
GridLayout网格布局
特点:多用于计算器或者拨号页面中的网格结构的布局
常用属性:
属性值直接添加数字即可,作用:设置网格中总共的行数以及列数有多少
android:rowCount="" 行数
android:columnCount="" 列数
指定当前控件位于网格中的第几行第几列中
行和列的索引从0开始
android:layout_row="0"
android:layout_column="0"
注意:不要越界,如:总共有4列,android:layout_column的属性值指定5
让当前控件的宽度拉伸为2列宽度
android:layout_columnSpan="2"
android:layout_gravity="fill"
让当前控件高度拉伸为2行的高度
android:layout_rowSpan="2"
android:layout_gravity="fill"
AbsoluteLayout绝对布局
指定当前控件左上的x,y坐标值,此坐标值是以整个手机为基准的
android:layout_x="10dp"
android:layout_y="10dp"
因其不利于屏幕适配,被废弃
总结:布局这么多??什么时候用那一种布局??
- 真正写项目时,极少用到AbsoluteLayout
- 如果要实现的布局效果存在网格效果,推荐使用GridLayout
- 大部分情况下,推荐使用相对布局,如果相对布局解决不了(实现n个控件之间宽度1:2:1显示)那就使用线性布局
- 或者说当页面的结构很简单,只是横向的或者竖向排列时也可直接使用线性布局
- FrameLayout一般配合Fragment使用
相册有图片的总结