一个好看又丰富的界面由许多控件组成,但是如果没有按照一定的顺序去摆放就会让界面乱糟糟的,为了让界面有序,需要借助布局来实现。布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而让界面变得有序和精美。布局的内部不单单可以放置控件,还可以放置布局,通过多层布局的嵌套,我们就能完成一些比较复杂的界面实现。下面的图可以很好的展示他们之间的关系。
线性布局(LinearLayout)
线性布局是一种非常常用的布局。正如它的名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列。线性排列有肯定不止一种方向,有水平也有垂直方向。我们可以通过指定属性android:orientation来实现水平或者垂直方向排列。下面通过在activity_main文件中编写代码来实现。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:text="按钮1"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:text="按钮2"
android:layout_height="wrap_content"/>
</LinearLayout>
效果图:
可以当我们看到不添加属性android:orientation和添加属性android:orientatinotallow='‘horizontal’'都是水平方向排列。
当我们设置属性值为vertical时,重新运行下程序
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />
</LinearLayout>
效果图:
注意:如何LinearLayout的排列方向为horizontal,内部的控件就绝不能将宽度设置为match_parent,因为这样的话,会导致单个控件就会将整个水平方向占满,其他控件就没有可放置的位置了。同样,如果排列方向是vertical,内部的控件高度就不能设置为match_parent。
接下来看android:layout_gravity属性,这个属性用于指定控件在布局中的对齐方式,但需注意的是,当LinearLayout的排列方式是horizontal时只有,垂直方向上的对齐方式才会生效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向的长度都会改变,因而无法指定该方向上的对齐方式。同样的道理,当LinearLayout的排列方向是vertical时,只有水平方向上的控件才会生效。在activity_main.xml文件书写以下代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_gravity=""
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_gravity="top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />
<Button
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />
<Button
android:layout_gravity="bottom"
android:text="按钮3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
运行程序:
接上来我们学习下LinearLayout中的另一个重要属性——android:layout_weight。这个属性允许我们使用比例的方式来指定控件的大小,它在手机屏幕的适配性方面可以起到非常重要的作用。比如我们正在编写一个消息发送界面,需要一个文本编辑框和一个发送按钮,修改activity_main.xml的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_gravity=""
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_gravity="top"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="按钮1" />
<EditText
android:layout_width="0dp"
android:layout_weight="1"
android:text="发送"
android:layout_height="wrap_content"/>
</LinearLayout>
效果图:
你会发现EditText和Button的宽度都指定成了0dp,这样文本编辑框和按钮还能显示出来吗?不用担心,由于我们使用了android:layout_weight属性,此时控件的宽度不应该由android:layout_width来决定,这里指定成0dp是一种比较规范的写法。在EditText和Button都将android:layout_weight属性值设为1,这表示两者平分宽度。为什么会这样呢?其实原理也很简单,系统会把LinearLayout下所有控件的android:layout_weight属性值相加,得到一个总值,然后每个控件占大小的比例就是用该控件android:layout_weight属性值除以刚才算出来的总值。