android:layout_below位置到底below到哪儿了?

android:layout_below是RelativeLayout的一个属性,其官方解释如下:

—Positions the top edge of this view below the given anchor view ID and must be a reference to another resource, in the form "@[+][package:]type:name"

我理解就是:将当前控件的顶部置于给定ID的控件之下,并且两控件应该对齐。然而事实证明我又傻傻的天真了T_T...
layout_blew.xml布局文件如下:

<?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">
    <TextView
        android:id="@+id/banner_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginBottom="3dp"
        android:layout_marginRight="6dp"
        android:includeFontPadding="false"
        android:text="东航旗舰店"
        android:visibility="visible"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/seat_space"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/banner_text"
        android:layout_toRightOf="@+id/banner_text"
        android:includeFontPadding="false"
        android:textSize="13sp"
        android:visibility="visible"
        tools:text="经济舱"/>
    
    <TextView
        android:id="@+id/airport_price_fee"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/seat_space"
        android:includeFontPadding="false"
        android:textSize="12sp"
        tools:text="机建0"/>
</RelativeLayout>

布局的初衷是想在同一个RelativeLayout中将“机建”放在第二栏:

刚开始以“东航旗舰店”为参照,使用属性android:layout_below="@+id/banner_text",但由于“东航旗舰店”是动态显示的,有时候VISIBLE,有时候GONE(此时android:layout_below就找不到参照了,“机建”就会与第一栏重合),要实现正常显示就只能以“经济舱”为参照,使用android:layout_below="@+id/seat_space"。可是基于对android:layout_below属性的理解,用了觉得结果会是下面这样的(其实又添加了android:layout_alignLeft属性才是下面的效果):

结果试了才知道真心错了,android:layout_below="@+id/seat_space"只要控件seat_space(经济舱)不设为GONE,也无论“经济舱”位置在哪儿,"机建"都会在“经济舱”的下面一排的最左边(前提是“机建”没有设置其他对齐属性)。

总结:

  • android:layout_below属性会将当前控件的顶部置于给定ID的控件之下,但并不会与给定ID的控件对齐,默认会放在父控件的最左边;
  • 可通过android:layout_alignLeftandroid:layout_alignRight等对齐属性改变当前控件设置android:layout_below属性后的默认位置,RelativeLayout的具体其他属性点这里

推荐阅读更多精彩内容