Ответ 1
Это дополнительный ответ Gravity и layout_gravity на Android.
Просмотр gravity
и layout_gravity
внутри относительной компоновки
Мое первоначальное утверждение о том, что gravity
и layout_gravity
не должно использоваться в подзаголовках a RelativeLayout
, было отчасти неправильным. gravity
работает отлично. Однако layout_gravity
не действует. Это можно увидеть в приведенном ниже примере. Светло-зеленый и голубой - это TextViews. Остальные два цвета фона - RelativeLayouts.
Как видите, gravity
работает, но layout_gravity
не работает.
Относительная компоновка с gravity
Мой оригинальный ответ о gravity
и layout_gravity
касался этих атрибутов, применяемых к представлениям в пределах ViewGroup
(в частности, LinearLayout
), а не самому ViewGroup
. Тем не менее, можно установить gravity
и layout_gravity
на RelativeLayout
. layout_gravity
повлияет на то, как RelativeLayout
позиционируется внутри своего собственного родителя, поэтому я не буду заниматься этим. Как gravity
влияет на subviews, однако, показано на изображении ниже.
Я изменил ширину всех подзонов, так что происходящее стало более ясным. Обратите внимание, что способ RelativeLayout
обрабатывать гравитацию - это взять все подзоны в виде группы и перемещать их по макету. Это означает, что любой вид будет самым широким, будет определять, как все остальное расположено. Таким образом, гравитация в относительной компоновке, вероятно, полезна, только если все подзоны имеют одинаковую ширину.
Линейная компоновка с gravity
Когда вы добавляете gravity
в LinearLayout
, он упорядочивает subviews, как и следовало ожидать. Например, можно "сохранить код", установив gravity
из LinearLayout
в center_horizontally
. Таким образом, нет необходимости индивидуально устанавливать layout_gravity
для каждого поднабора. См. Различные варианты на изображении ниже.
Обратите внимание, что когда вид использует layout_gravity
, он переопределяет гравитацию LinearLayout. (Это можно увидеть в заголовке для двух макетов в левом изображении. LinearLayout gravity
был установлен в left
и right
, но заголовок TextView layout_gravity
был установлен в center_horizontally
.)
Заключительные заметки
Когда позиционирует представления в RelativeLayout, общий способ сделать это - добавить к каждому представлению следующие вещи:
-
layout_alignParentTop
-
layout_centerVertical
-
layout_below
-
layout_toRightOf
Если вы хотите сразу установить все представления, LinearLayout
, вероятно, будет лучше (или, возможно, с использованием стиля).
Итак, чтобы подвести итог,
-
layout_gravity
не работает для subviews в RelativeLayout. -
gravity
RelativeLayout работает, но не так, как можно было бы ожидать.
Дополнительный XML
XML для изображения "Просмотр gravity
и layout_gravity
внутри относительной компоновки:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#e3e2ad" >
<TextView
android:id="@+id/tvTop1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="24sp"
android:text="Views' gravity=" />
<!-- examples of gravity -->
<TextView
android:id="@+id/tvTop2"
android:layout_below="@id/tvTop1"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:id="@+id/tvTop3"
android:layout_below="@id/tvTop2"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:id="@+id/tvTop4"
android:layout_below="@id/tvTop3"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:id="@+id/tvTop5"
android:layout_below="@id/tvTop4"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#d6c6cd" >
<TextView
android:id="@+id/tvBottom1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="24sp"
android:text="Views' layout_gravity=" />
<!-- examples of layout_gravity -->
<TextView
android:id="@+id/tvBottom2"
android:layout_below="@id/tvBottom1"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="left"
android:background="#bcf5b1"
android:text="left" />
<TextView
android:id="@+id/tvBottom3"
android:layout_below="@id/tvBottom2"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:background="#aacaff"
android:text="center_horizontal" />
<TextView
android:id="@+id/tvBottom4"
android:layout_below="@id/tvBottom3"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="right"
android:background="#bcf5b1"
android:text="right" />
<TextView
android:id="@+id/tvBottom5"
android:layout_below="@id/tvBottom4"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:background="#aacaff"
android:text="center" />
</RelativeLayout>
</LinearLayout>
XML для изображения "Относительная макета с гравитацией" :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_horizontal"
android:background="#e3e2ad" >
<TextView
android:id="@+id/tvTop1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Views' gravity=" />
<!-- examples of gravity -->
<TextView
android:id="@+id/tvTop2"
android:layout_below="@id/tvTop1"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:id="@+id/tvTop3"
android:layout_below="@id/tvTop2"
android:layout_width="300dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:id="@+id/tvTop4"
android:layout_below="@id/tvTop3"
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:id="@+id/tvTop5"
android:layout_below="@id/tvTop4"
android:layout_width="150dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:background="#d6c6cd" >
<TextView
android:id="@+id/tvBottom1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Views' gravity=" />
<!-- examples of layout_gravity -->
<TextView
android:id="@+id/tvBottom2"
android:layout_below="@id/tvBottom1"
android:layout_width="200dp"
android:layout_height="40dp"
android:gravity="left"
android:background="#bcf5b1"
android:text="left" />
<TextView
android:id="@+id/tvBottom3"
android:layout_below="@id/tvBottom2"
android:layout_width="300dp"
android:layout_height="40dp"
android:gravity="center_horizontal"
android:background="#aacaff"
android:text="center_horizontal" />
<TextView
android:id="@+id/tvBottom4"
android:layout_below="@id/tvBottom3"
android:layout_width="100dp"
android:layout_height="40dp"
android:gravity="right"
android:background="#bcf5b1"
android:text="right" />
<TextView
android:id="@+id/tvBottom5"
android:layout_below="@id/tvBottom4"
android:layout_width="150dp"
android:layout_height="40dp"
android:gravity="center"
android:background="#aacaff"
android:text="center" />
</RelativeLayout>
</LinearLayout>
XML для изображения "Линейная компоновка с гравитацией" :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_horizontal"
android:background="#e3e2ad"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="View gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:layout_width="300dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:layout_width="150dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:background="#d6c6cd"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="View gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:layout_width="300dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:layout_width="150dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</LinearLayout>
</LinearLayout>