登录后台

页面导航

本文编写于 2407 天前,最后修改于 1668 天前,其中某些信息可能已经过时。

前言

话说上一节的标题其实写错了,因为上一节其实没讲相对布局。前几天感冒耽误了两天,今天舒服了一些,继续奋斗!

根据父布局定位

所谓的 RelativeLayout(相对布局)就是用相对位置定位的布局。先来看一下继承结构:

可见 RelativeLayout 和 LinearLayout 一样都是 ViewGroup,都是 View 的子类。RelativeLayout 是一个布局,其中的子 View 的位置可以通过和别的 View 或 父布局的关系来描述。这怎么被我形容的这么抽象...直接先看看代码吧,这东西就叫 RelativeLayout :

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:text="左上角"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:text="又上角"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="中间"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:text="左下角"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="右下角"/>

</RelativeLayout>

先来看一下效果图吧:

现在仔细分析一下代码,乍一看挺复杂的。其实不然,很多都是我们学过的。只有这一系列是新面孔:

属性名含义
layout_alignParentTop在父布局的顶部
layout_alignParentBottom在父布局的底部
layout_alignParentLeft在父布局的左边
layout_alignParentRight在父布局的右边
ayout_centerInParent在父布局的中心
layout_centerVertical在父布局水平居中
layout_centerHorizontal在父布局垂直居中

其实就是翻译了一下名字,把对应的属性值设置为「true」就生效。这些值通常都组合使用,比如在右上角就可以分解为「在父布局的右边」+「在父布局的顶部」。

根据兄弟组件定位

话不多说,看代码:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_centerInParent="true"
        android:text="中间"
        android:id="@+id/button_center" />
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="左上角"
        android:layout_toLeftOf="@id/button_center"
        android:layout_above="@id/button_center"
        android:id="@+id/button_above_left"/>
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="右上角"
        android:layout_toRightOf="@id/button_center"
        android:layout_above="@id/button_center"
        android:id="@+id/button_above_right"/>
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="左下角"
        android:layout_toLeftOf="@id/button_center"
        android:layout_below="@id/button_center"
        android:id="@+id/button_below_left"/>
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="右下角"
        android:layout_toRightOf="@id/button_center"
        android:layout_below="@id/button_center"
        android:id="@+id/button_below_right"/>
    
</RelativeLayout>

这次的新属性更加的直白:

属性解释
layout_above在目标控件的上面
layout_below在目标控件的下面
layout_toLeftOf在目标控件的左边
layout_toRightOf在目标控件的右边
layout_alignTop对齐目标控件的上边界
layout_alignBottom对齐目标控件的下边界
layout_alignLeft对齐目标控件的左边界
layout_alignRight对齐目标控件的右边界

举个栗子:比如控件 a 要在控件 b 的右边,实现的步骤就是先给控件 b 设定一个 id ,然后给 a 定义上面表里的「在目标布局的右边」属性。不过要注意的是当一个控件去引用另一个控件的 id 时,该控件一定要定义在引用控件的后面,不然会出现找不到 id 的异常现象,不过也挺好理解的,因为程序是从上到下解析的。效果图如下:

总结

今天我们讲了相对布局,可能是上天眷顾我,这一讲很简单。RelativeLayout 是一个很常用的布局,大家一定要掌握,那么作业来了,做一个简单的遥控器的界面:

大家一定要加油!!

2020/5/24 注:
这是我 2018 年高中毕业的假期写的,当时并没有自己搭建博客,近期我给这一系列的文章都放到我自己的博客上。
当时写这个系列文章的想法就是扎实下基础,然后能帮到更多的人就更好了,但是大学开学之后就开始了新生活,没有大块的时间去编撰,系列文章也没有再更新过。但是我其实并不想放弃这个系列,那就,有缘再见吧,拜拜ヾ(•ω•`)o