刚看到布局就让笔者想到了CSS里面的盒子,不知道大家用没用过Java自带的可视化界面Swing,现在早就被淘汰了,但是鄙人有幸在大学期间使用这个技术做过一次课设,和Android一样都有布局的概念,而且每个控件也是通过监听器来绑定事件。感觉大同小异,所以废话不多说,让我们来看看Android的经典四种布局。
线性布局
——第一行代码
LinearLayout又称作线性布局,是一种非常常用的布局。正如它的名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列。相信你之前也已经注意到了,我们在上一节中学习控件用法时,所有的控件就都是放在LinearLayout布局里的,因此上一节中的控件也确实是在垂直方向上线性排列的。
可以通过android:orientation="vertical"来调整线性的方向,vertical是竖直,horizontal是水平。
layout_gravity
android:gravity和android:layout_gravity的区别
——第一行代码
首先来看android:layout_ gravity 属性,它和我们上一节中学到的android:gravity属性看起来有些相似,这两个属性有什么区别呢?其实从名字就可以看出,android:gravity用于指定文字在控件中的对齐方式,而android: layout_ gravity用于指定控件在布局中的对齐方式。
android:layout_ gravity 的可选值和android:gravity差不多,但是需要注意,当LnearLayout的排列方向是horizontal时,只有垂直方向上的对齐方式才会生效,因为此时水平方句上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。同样的道理,当LinearLayout的排列方向是vertical时,只有水平方向上的对齐方式才会生效
其实这个还是比较难理解的,而且语言的描述都是抽象的,想要明白最好的方法就是自己敲敲,眼睛看到的才是最直观的。
这里值得注意的就是,当我们的LinearLayout的orientation的属性值是horizontal也就是水平方向时:--->我们可以设置控件的layout_gravity属性值为:竖直方向的变化比如bottom,top,center_vertical。
当我们的LinearLayout的orientation的属性值是vertical也就是竖直方向是:--->我们可以设置控件的layout_gravity属性值为:水平方向的变化比如right,left,center_horizontal。
layout_weight
layout_weight我理解就是比重的意思,如果layout_weight存在,就会自动替代layout_width,所有在有layout_weight的时候,layout_width的规范写法就是0dp,其中dp是单位。至于比重是什么意思,很好理解就是在一个区域内的比值,比如两个控件的比重都是1,那么他们就平分这个区域。如图所示
如果想要按比例,只需要加权即可。例如想要第一个按钮占3/5,第二个按钮占2/5,就在第一个按钮的weight赋值3,第二个按钮的weight赋值2。
这种方式非常适合在多平台使用,即使不知道手机的型号,也可以实现布局。
相对布局
相对布局使用十分广泛,而且随意的多。具体看下下面的代码,很容易理解
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RelativeLayout">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Button 1 "
android:id="@+id/btn1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button 2 "
android:id="@+id/btn2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:text="Button 3 "
android:id="@+id/btn3" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="Button 4 "
android:id="@+id/btn4" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button 5 "
android:id="@+id/btn5" />
</RelativeLayout>
相对布局还有一些其他属性
android:layout_above="@+id/" | 在id控件上 |
android:layout_below=""|在id控件下
android:layout_toRightOf=""|在id控件右
android:layout_toLeftOf=""|在id控件左
android:layout_alignTop=""|和id控件顶端对齐
android:layout_alignBottom=""|和id控件底部对齐
android:layout_alignLeft=""|和id控件左边对齐
android:layout_alignRight=""|和id控件右边对齐
线性布局和相对布局的选择
这两个布局是现在使用最多的布局,几乎不会使用到其他布局。虽然谷歌推出了约束布局,功能很强大,但是新的东西被接受是有时间过程的。目前学会这两个布局足以,而如何选择呢。
如果需要的模块就是自上而下或者自左而右排布的,那毫无疑问就是线性布局,还可以使用权重来实现自适应。
如果对控件的位置需要设置,例如之间有间隔,或者在左,在右,在上,在下。就需要使用到相对布局。因为线性布局只通过layout_gravity属性是没有办法实现水平排布时的水平方向和竖直排布时的竖直方向位子改变。就像下图所示,在水平线性布局中无法实现以下布局,如果想要实现的话就要用到相对布局。
其实实际开发中还有很多技巧,例如两种布局的嵌套使用,这些都是三言两语无法表达清楚地,需要同学们自己在实际开发中,通过更加直观的接触来领悟。
帧布局
因为所有控件全部默认放在左上角,由于缺少定位方式,所以帧布局使用很少。在切换Fragment的时候会使用到这个布局,但是这些都是后话了。看到Fragment那章就明白了。
百分比布局
百分比布局的意义在于为相对布局和帧布局加上只有线性布局特有的功能——layout_weight,这样就可以在相对布局和帧布局中按比例放置控件。
几乎用不到,而且还需要导包,这里就不细说。