В чем разница между гравитацией и layout_gravity в Android? - PullRequest
1255 голосов
/ 14 августа 2010

Я знаю, что мы можем установить следующие значения для свойств android:gravity и android:layout_gravity:

  1. center
  2. center_vertical
  3. center_horizontal и т. Д.

Но я запутался в отношении обоих.

В чем разница между использованием android:gravity и android:layout_gravity?

Ответы [ 20 ]

1284 голосов
/ 14 августа 2010

Их имена должны помочь вам:

  • android:gravity устанавливает вес содержимого (то есть его подпредставлений) View, на котором оно используется.
  • android:layout_gravity устанавливает гравитацию View или Layout относительно его родителя.

И пример: здесь .

485 голосов
/ 04 октября 2014

Внутри - Снаружи

  • gravity упорядочивает содержимое внутри представления.
  • lay<strong>out</strong>_gravity размещает позицию вида вне от себя.

Иногда тоже помогает увидеть картинку. Зеленый и синий TextViews, а два других цвета фона LinearLayouts.

enter image description here

Примечания

  • layout_gravity не работает для представлений в RelativeLayout. Используйте его для просмотра в LinearLayout или FrameLayout. См. Мой дополнительный ответ для более подробной информации.
  • Ширина представления (или высота) должна быть больше его содержимого. В противном случае gravity не будет иметь никакого эффекта. Таким образом, wrap_content и gravity не имеют смысла вместе.
  • Ширина представления (или высота) должна быть меньше родительской. В противном случае layout_gravity не будет иметь никакого эффекта. Таким образом, match_parent и layout_gravity не имеют смысла вместе.
  • layout_gravity=center выглядит так же, как layout_gravity=center_horizontal здесь, потому что они находятся в вертикальной линейной компоновке. В этом случае вертикальное центрирование невозможно, поэтому layout_gravity=center центрируется только горизонтально.
  • Этот ответ касался только установки gravity и layout_gravity для представлений в макете. Чтобы увидеть, что происходит, когда вы устанавливаете gravity самого родительского макета, посмотрите дополнительный ответ , о котором я говорил выше. (Резюме: gravity плохо работает на RelativeLayout, но может быть полезно с LinearLayout.)

Итак, помните, layout _gravity упорядочивает вид в layout . Gravity упорядочивает содержимое внутри представления.

XML

Вот 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: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="gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            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: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="layout_gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="left"
            android:background="#bcf5b1"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:background="#aacaff"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="right"
            android:background="#bcf5b1"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:background="#aacaff"
            android:text="center" />

    </LinearLayout>

</LinearLayout>

Относящиеся

455 голосов
/ 25 июля 2011

Разница

android:layout_gravity - это Снаружи Гравитация вида.Определяет направление, в котором вид должен касаться границы своего родителя.

android:gravity - это Внутри гравитация этого вида.Указывает, в каком направлении должно выравниваться его содержимое.

Эквиваленты HTML / CSS

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align

Простой прием, который поможет вам запомнить

Принимать layout-gravity как "Lay"-outside гравитации».

38 голосов
/ 31 июля 2011

Краткий ответ: используйте android:gravity или setGravity() для управления гравитацией всех дочерних видов контейнера;используйте android:layout_gravity или setLayoutParams() для управления гравитацией отдельного вида в контейнере.

Длинная история: для управления гравитацией в контейнере с линейной компоновкой, например LinearLayout или RadioGroup, существует два подхода:

1) Чтобы контролировать гравитацию ВСЕХ дочерних представлений контейнера LinearLayout (как вы это делали в своей книге), используйте android:gravity (не android:layout_gravity) в XML-файле макета или setGravity()метод в коде.

2) Чтобы управлять гравитацией дочернего представления в его контейнере, используйте атрибут android:layout_gravity XML.В коде нужно получить LinearLayout.LayoutParams вида и установить его гравитацию.Вот пример кода, который устанавливает кнопку на дно в горизонтально ориентированном контейнере:

import android.widget.LinearLayout.LayoutParams;
import android.view.Gravity;
...

Button button = (Button) findViewById(R.id.MyButtonId);
// need to cast to LinearLayout.LayoutParams to access the gravity field
LayoutParams params = (LayoutParams)button.getLayoutParams(); 
params.gravity = Gravity.BOTTOM;
button.setLayoutParams(params);

Для горизонтального LinearLayout контейнера горизонтальная гравитация его дочернего вида выравнивается по левому краю один за другим и не может бытьизменилось.Настройка android:layout_gravity на center_horizontal не имеет никакого эффекта.Вертикальная гравитация по умолчанию - центр (или center_vertical) и может быть изменен на верх или низ.На самом деле значение по умолчанию layout_gravity равно -1, но Android помещает его по центру.

Чтобы изменить горизонтальные позиции дочерних видов в горизонтальном линейном контейнере, можно использовать layout_weight, поле и отступ дочернего вида.

Аналогично, для контейнера вертикальной группы представлений вертикальная гравитация его дочернего вида выравнивается сверху друг над другом и не может быть изменена.Горизонтальная гравитация по умолчанию - центр (или center_horizontal) и может быть изменена на левую или правую.

На самом деле, дочернее представление, такое как кнопка, также имеет атрибут android:gravity XML и метод setGravity() дляконтролировать свои дочерние представления - текст в нем.Button.setGravity(int) связан с этой записью developer.android.com .

34 голосов
/ 14 августа 2010

Из того, что я могу собрать layout_gravity - это гравитация этого вида внутри его родителя, а gravity - это гравитация детей внутри этого вида.

Iдумаю, что это правильно, но лучший способ выяснить это - поиграть.

25 голосов
/ 04 февраля 2015

Посмотрите на изображение, чтобы прояснить гравитацию

13 голосов
/ 23 ноября 2010

Хотя на вопрос уже дан ответ, у меня есть несколько примеров, демонстрирующих использование гравитации, layout_gravity и layout_weight.

Примеры можно найти по адресу http://juanpickselov.com/LayoutExamples.zip

Я создал файлы в Eclipse, удалил подпапки .svn и включил стили, строки, цвета и т. Д. Файлы макетовявляются основной точкой демонстрации.Поскольку я новичок в разработке на Java и Android, можно найти Java неэффективным.Файлы могут быть скопированы в проект Eclipse, или я также использовал их в Netbeans с плагином разработки Android, доступным для этой IDE.

11 голосов
/ 10 апреля 2013

Если мы хотим установить гравитацию контента внутри представления, мы будем использовать «android: gravity», и если мы хотим установить гравитацию этого представления (в целом) в его родительском представлении, мы будем использовать "андроид: layout_gravity".

7 голосов
/ 15 апреля 2015

Просто подумал, что я добавлю свое собственное объяснение здесь - исходя из фона для iOS, вот как я усвоил два в терминах iOS: «Layout Gravity» влияет на вашу позицию в суперпредставлении.«Гравитация» влияет на положение ваших подпредставлений внутри вас.Иными словами, Layout Gravity позиционирует себя, а гравитация - ваших детей.

6 голосов
/ 17 октября 2016

Существует много различий в gravity и layout-gravity. Я собираюсь объяснить свой опыт в отношении этих двух концепций ( Вся информация, которую я получил благодаря моим наблюдениям и некоторым веб-сайтам ).

Использование Gravity и Layout-gravity в FrameLayout .....

Примечание: -

  1. Гравитация используется внутри Просмотр содержимого , поскольку некоторые пользователи имеют ответ, и он одинаков для всех ViewGroup Layout.

  2. Layout-gravity используется с родительским представлением, поскольку некоторые пользователи имеют ответ.

  3. Gravity and Layout-gravity это работа более полезная с FrameLayout childs. We can't use Gravity and Layout-gravity в теге FrameLayout ....

  4. Мы можем установить Child View в любом месте FrameLayout, используя layout-gravity.

  5. Мы можем использовать все значения гравитации внутри FrameLayout (например: - center_vertical, center_horizontal, center, top и т. Д.), Но это невозможно с другими макетами ViewGroup.

  6. FrameLayout полностью работает на Layout-gravity. Пример: - Если вы работаете с FrameLayout, то вам не нужно менять весь макет для добавления нового вида. Вы просто добавляете View как последний в FrameLayout и даете ему Layout-gravity со значением. ( Это преимущества макетной гравитации с FrameLayout ).

посмотрите на пример ......

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center"
        android:text="Center Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#1b64b9"
        android:gravity="bottom"
        android:layout_gravity="bottom|center"
        android:text="Bottom Layout Gravity" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#d75d1c"
        android:gravity="top"
        android:layout_gravity="top|center"
        android:text="Top Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="100dp"
        android:textColor="#d71f1c"
        android:gravity="top|right"
        android:layout_gravity="top|right"
        android:text="Top Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="bottom"
        android:gravity="bottom"
        android:text="Top Left Layout Gravity"/>

</FrameLayout>

Выход: -

g1

Использование Gravity и Layout-gravity в LinearLayout .....

Gravity работает так же, как и выше, но здесь есть различие в том, что мы можем использовать гравитацию внутри LinearLayout View и RelativeLayout View, что невозможно в FrameLayout View.

LinearLayout с ориентацией по вертикали ....

Примечание: - Здесь мы можем установить только 3 значения layout_gravity, то есть (left | right | center (также называемое center_horizontal)).

посмотрите на пример: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:text="Center Layout Gravity \nor \nCenter_Horizontal"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="right"
        android:text="Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:gravity="bottom"
        android:text="Left Layout Gravity"/>

</LinearLayout>

Выход: -

g2

LinearLayout с горизонтальной ориентацией ....

Примечание: - Здесь мы также можем установить 3 значения layout_gravity, то есть (top | bottom | center (также называемые center_vertical)).

посмотрите на пример: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:text="Bottom \nLayout \nGravity"/>

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="center"
        android:text="Center \nLayout \nGravity"/>


    <TextView
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:text="Left \nLayout \nGravity"/>

</LinearLayout>

вывод: -

g3

Примечание: - Мы не можем использовать layout_gravity в RelativeLayout Views, но мы можем использовать gravity, чтобы установить RelativeLayout потомков в одну и ту же позицию ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...