В чем разница между гравитацией и layout_gravity в Android?

1330

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

  1. center
  2. center_vertical
  3. center_horizontal, так далее.

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

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

Пареш Майани
источник
265
Легкий трюк для запоминания: воспринимайте «макет-гравитацию» как «макет-гравитация снаружи»
Вишну Харидас
6
center == center_vertical | center_horizontal
Юша Алеауб
4
Эти видео очень помогли мне понять разницу: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Рони Кастро
ImageViewКажется, ведут себя иначе, чем у TextView.
Самис

Ответы:

1348

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

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

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

Sephy
источник
88
По сути, все с layout_чем-то определяет то, что влияет на элементы снаружи.
Triang3l
29
Видите ли, я нахожу это забавным, потому что, если я просто вычеркну имена, моя интуиция будет наоборот. Каждый раз, я думаю, что layout_gravity означает «гравитацию того, как эта ViewGroup выкладывает свое содержимое», а «gravity» - это «куда стремится это представление».
Огр
15
Так что же произойдет, если для параметра android:gravityустановлено значение left, а для его дочерних элементов android:layout_gravityустановлено значение right? с какой стороны выстроятся дети?
Thupten
2
Как @Suragch прокомментировал свой ответ, layout_gravity работает только в LinearLayout и FrameLayout. LinearLayout имеет ограничения на это, хотя.
Марко Луглио
1
@ Thupten Очень хороший вопрос. Я думаю, что один будет преобладать (я думаю, что layout_gravity для детей), а другой только по умолчанию для преобладающего.
Триларион
523

Внутри снаружи

  • gravityупорядочивает содержимое внутри представления.
  • layout_gravityорганизует позицию вида вне себя.

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

введите описание изображения здесь

Ноты

  • 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.)

Помните, что макет _gravity упорядочивает вид в своем макете . 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>

связанные с

Suragch
источник
кажется, легче увидеть это визуально, спасибо Сурагчу.
Haritsinh Gohil
467

Разница

android:layout_gravityявляется Outside Серьезность View. Определяет направление, в котором представление должно касаться границы своего родителя.

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

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

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

Легкий трюк, чтобы помочь вам вспомнить

Взять layout-gravityкак "Лай-аут-гравитация".

Вишну Харидас
источник
это имеет больше смысла, когда у вас есть фон веб-разработки.
Haritsinh Gohil
41

Краткий ответ: используйте 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 .

Ин
источник
36

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

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

matto1990
источник
29

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

Акшай Паливал
источник
12

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

Абхишек Тамта
источник
8

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

mszaro
источник
7

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

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

Запись:-

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

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

  3. Gravity and Layout-gravityэто работа более полезна с FrameLayoutдетьми. 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_gravityis 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_gravityis 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чтобы установить RelativeLayoutchilds в той же позиции ....

sushildlh
источник
1
Если бы вы установили textColorбелый цвет, viewто это было бы очень здорово. : D
Пратик Бутани
Ты уверен? Он будет выглядеть черно-белым, поэтому я использовал разные цвета для каждого вида.
sushildlh
6

Легкая уловка, чтобы помнить, что гравитация применяется к нам внутри Земли. Итак, android:gravityдля внутреннего обзора.

Rememeber с отъездом в скрутках из _gravity , которые помогли бы , чтобы вы запомнили , что android:layout_gravityбудет ссылаться вне точки зрения

Махендра Лия
источник
5

То, что я увидел в блоге Сандипа, которое я почти пропустил, решило мою проблему. Он сказал, что layout_gravityне работает с LinearLayout.

Если вы используете a LinearLayoutи настройки гравитации сводят вас с ума (как и я), то переключитесь на что-то другое.

Я на самом деле переключился на RelativeLayoutтогда использованный layout_alignParentLeftи layout_alignParentRightна 2 содержал TextViews, чтобы получить их на одной линии, чтобы идти далеко налево и далеко направо.

JustSomeGuy
источник
4

Основное различие между ними заключается в том, что

Android: гравитация используется для дочерних элементов представления.

android: layout_gravity используется для этого элемента относительно родительского представления.

Абхишек Т.
источник
3

android:gravityиспользуется для указания того, как поместить содержимое объекта в сам объект. Иными словами, android: gravity используется для указания серьезности содержимого представления.

android:layout_gravity это атрибуция, которую ребенок может предоставить своему родителю, чтобы определить серьезность представления в его родителях.

Для более подробной информации вы можете посетить

http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html

IntelliJ Amiya
источник
2
Я думаю, что нет необходимости в новом ответе, поскольку уже опубликовано несколько ответов с почти одинаковым содержанием!
Пареш Майани
3

Гравитация: позволяет перемещать содержимое внутри контейнера. (Как будут размещены подвиды).

Важно: (ПЕРЕМЕСТИТЬ вдоль оси X или оси Y в пределах доступного пространства).

Пример: допустим, если вы работали с LinearLayout (Height: match_parent, Width: match_parent) в качестве элемента корневого уровня, то у вас будет полное доступное пространство кадра; и дочерние представления говорят, что 2 TextViews (Height: wrap_content, Width: wrap_content) внутри LinearLayout можно перемещать по оси x / y, используя соответствующие значения для гравитации на родителе.

Layout_Gravity: позволяет переопределить поведение родительской гравитации ТОЛЬКО вдоль оси x.

Важно: (MOVE [переопределить] вдоль оси X в пределах доступного пространства).

Пример: если вы помните предыдущий пример, мы знаем, что гравитация позволила нам двигаться вдоль оси x / y, т.е. место TextViews внутри LinearLayout. Давайте просто скажем, что LinearLayout определяет гравитацию: центр; Это означает, что каждый TextView должен быть в центре как вертикально, так и горизонтально. Теперь, если мы хотим, чтобы один из TextView двигался влево / вправо, мы можем переопределить указанное поведение гравитации, используя layout_gravity в TextView.

Бонус: если вы копаете глубже, вы обнаружите, что текст в TextView действует как подвид; поэтому, если вы примените гравитацию к TextView, текст внутри TextView будет перемещаться. (вся концепция применима и здесь)

Али Раза
источник
1

Гравитация используется для установки выравнивания текста в видах, но layout_gravity используется для самостоятельного задания видов. Давайте возьмем пример, если вы хотите выровнять текст, написанный в editText, затем использовать гравитацию, и вы хотите выровнять этот editText или любую кнопку или любое представление, а затем использовать layout_gravity, так что это очень просто.

Правин Гаур
источник
1

Гравитация : используется для простых представлений, таких как textview, edittext и т. д.

layout_gravity : используется для гравитации текущего вида только в контексте его относительного родительского вида, такого как линейный макет или FrameLayout, чтобы сделать вид в центре или любой другой гравитации своего родителя.

Маянк Гарг
источник
layout_gravity: используется для текущего представления только гравитации в контексте его относительного родителя, а не для других представлений, которые находятся внутри его родителя.
Чинтак Патель
0
android:gravity

используется для настройки содержимого представления относительно его заданной позиции (выделенной области). android:gravity="left" не будет ничего делать, если layout_widthравно"wrap_content"

android:layout_gravity 

используется для самого представления относительно родительского файла или файла макета.

Базилик
источник
0

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

android:layout_gravity -> Устанавливает гравитацию своего родительского вида или макета

Vamsi
источник
0

гравитация - относится к своему собственному мнению.

layout-gravity --- Применяется к представлению, связанному с его родителем.

нидхи
источник
0

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

Joel
источник