相对布局。有两种选择:

  • 相对父级容器确定自身位置;

  • 相对兄弟元素确定自身位置。

相对父级容器定位

默认在左上角

下面最外层容器是 RelativeLayout 布局,宽高都适合手机屏一样的。内部有两个控件 Button 和 ImageView,如果子控件没有添加相对定位相关属性,默认都是位于父容器左上角的。

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:layout_height="wrap_content"
  7. android:layout_width="wrap_content"
  8. android:text="Button1"/>
  9. <ImageView
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:src="@mipmap/ic_launcher"/>
  13. </RelativeLayout>

子控件没写相对定位相关属性,默认都会位于父容器左上角,多个子控件位置会重叠。

RelativeLayout - 图1

相对父容器定位相关属性

  1. android:layout_alignParentTop="true"
  2. android:layout_alignParentBottom="true"
  3. android:layout_alignParentLeft="true"
  4. android:layout_alignParentRight="true"
  5. android:layout_centerHorizontal="true" 相对父容器水平居中
  6. android:layout_centerVertical="true" 相对父容器垂直居中
  7. android:layout_centerInParent="true" 相对父容器垂直+水平居中
  8. android:layout_alignParentEnd="true"
  9. android:layout_alignParentStart="true"


子控件只能位于父容器下面红圈所在位置。上下左右或拐角的位置。

RelativeLayout - 图2

场景一:左右

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:layout_height="wrap_content"
  7. android:layout_width="wrap_content"
  8. android:layout_alignParentLeft="true"
  9. android:text="Button1"/>
  10. <ImageView
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_alignParentRight="true"
  14. android:src="@mipmap/ic_launcher"/>
  15. </RelativeLayout>

上述代码两个子控件一个在左边,一个在右边。

RelativeLayout - 图3

场景二:垂直水平居中

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:layout_height="wrap_content"
  7. android:layout_width="wrap_content"
  8. android:layout_centerInParent="true"
  9. android:text="Button1"/>
  10. </RelativeLayout>

只有 layout_centerInParent 时控件相对于父容器垂直水平居中。

RelativeLayout - 图4

场景三:左居中

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:layout_height="wrap_content"
  7. android:layout_width="wrap_content"
  8. android:layout_alignParentLeft="true"
  9. android:layout_centerInParent="true"
  10. android:text="Button1"/>
  11. </RelativeLayout>

layout_alignParentLeft 设置子控件位于父容器左边位置,layout_centerInParent 设置子控件在左边居中,如下:

RelativeLayout - 图5

场景四:右上

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:layout_height="wrap_content"
  7. android:layout_width="wrap_content"
  8. android:layout_alignParentRight="true"
  9. android:layout_alignParentTop="true"
  10. android:text="Button1"/>
  11. </RelativeLayout>

同时设置 layout_alignParentTop 和 layout_alignParentRight 设置子控件右上角,以此类推。

RelativeLayout - 图6

相对兄弟元素定位

  1. android:layout_toLeftOf="@id/button_1"
  2. android:layout_toRightOf="@id/button_1"
  3. android:layout_above="@id/button_1"
  4. android:layout_below="@id/button_1"

场景一:默认位置

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:id="@+id/button_1"
  7. android:layout_height="wrap_content"
  8. android:layout_width="wrap_content"
  9. android:layout_centerInParent="true"
  10. android:text="Button1"/>
  11. <Button
  12. android:layout_height="wrap_content"
  13. android:layout_width="wrap_content"
  14. android:text="Button2"/>
  15. </RelativeLayout>

Button1 按钮垂直水平居中,Button2 按钮没有设置任何相对定位,默认居于父容器左上角,这一点做两层意思表达:

  • Button2 默认水平位置居左;

  • Button2 默认垂直位置居上。

RelativeLayout - 图7

场景二:相对兄弟元素改变水平位置

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:id="@+id/button_1"
  7. android:layout_height="wrap_content"
  8. android:layout_width="wrap_content"
  9. android:layout_centerInParent="true"
  10. android:text="Button1"/>
  11. <Button
  12. android:layout_height="wrap_content"
  13. android:layout_width="wrap_content"
  14. android:layout_toLeftOf="@id/button_1"
  15. android:text="Button2"/>
  16. </RelativeLayout>

Button2 添加 layout_toLeftOf 属性,值为 Button1 的 ID 值,作用为水平位置相对于 Button1 移动到它的左边。看到 left/right 左右左右肯定是水平位置改变咯。此时垂直位置并未改变,仍然垂直居上。

RelativeLayout - 图8

场景三:在场景二基础上修改垂直位置

  1. <RelativeLayout
  2. android:layout_height="match_parent"
  3. android:layout_width="match_parent"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <Button
  6. android:id="@+id/button_1"
  7. android:layout_height="wrap_content"
  8. android:layout_width="wrap_content"
  9. android:layout_centerInParent="true"
  10. android:text="Button1"/>
  11. <Button
  12. android:layout_height="wrap_content"
  13. android:layout_width="wrap_content"
  14. android:layout_toLeftOf="@id/button_1"
  15. android:layout_above="@id/button_1"
  16. android:text="Button2"/>
  17. </RelativeLayout>

可以看到在场景二基础上 Button2 又添加了 layout_above 属性,看到 above/below 上下上下只改变垂直方向位置。Button2 的垂直方向改变到 Button1 的上方,结合场景二,即 Button2 位于 Button1 的左上角。

RelativeLayout - 图9

实际应用

应用一:小说列表页面

  1. <LinearLayout
  2. android:layout_height="100dp"
  3. android:layout_width="match_parent"
  4. android:paddingHorizontal="20dp"
  5. android:paddingVertical="10dp"
  6. android:background="#cccccc"
  7. xmlns:android="http://schemas.android.com/apk/res/android">
  8. <ImageView
  9. android:layout_width="wrap_content"
  10. android:layout_height="match_parent"
  11. android:padding="10dp"
  12. android:src="@mipmap/ic_launcher"/>
  13. <RelativeLayout
  14. android:layout_width="0dp"
  15. android:layout_height="match_parent"
  16. android:paddingVertical="10dp"
  17. android:layout_weight="1">
  18. <TextView
  19. android:layout_height="wrap_content"
  20. android:layout_width="wrap_content"
  21. android:text="兵者"
  22. android:textSize="20sp"/>
  23. <TextView
  24. android:layout_height="wrap_content"
  25. android:layout_width="wrap_content"
  26. android:text="作者:七品"
  27. android:textSize="16dp"
  28. android:layout_alignParentBottom="true"
  29. android:layout_alignParentRight="true"/>
  30. <TextView
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:text="更新时间: 2018-11-23"
  34. android:textSize="16dp"
  35. android:layout_alignParentBottom="true"
  36. android:layout_alignParentLeft="true"/>
  37. </RelativeLayout>
  38. </LinearLayout>

RelativeLayout - 图10

说明:

  • 最外层是 LinearLayout 布局,将一行分为左右两个部分;

RelativeLayout - 图11

  • 右边布局用 RelativeLayout 相对布局,内部就三个子控件,一个相对父容器左上,一个相对父容器左下,一个相对父容器右下。

RelativeLayout - 图12