What is the difference between gravity and layout_gravity in Android?

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

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

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

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

23 ответа

Решение

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

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

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

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

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

связанные с

Различия

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

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

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

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

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

принимать layout-gravity как "Lay-outside-gravity".

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

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

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

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

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

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

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

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

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

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

Помните, что в макете _gravity, который поможет вам вспомнить, что android:layout_gravity будет ссылаться на внешний вид

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

Использование гравитации и макет гравитации в FrameLayout.....

Заметка:-

  1. Гравитация используется внутри просмотра содержимого, так как некоторые пользователи имеют ответ, и она одинакова для всех 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_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 Чайлдс в той же позиции....

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

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

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

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

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

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

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

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

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

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

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

Важно: (ПЕРЕМЕСТИТЬ вдоль оси 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 будет перемещаться. (вся концепция применима и здесь)

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

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

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

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

И Gravity, и layout_gravity - это атрибуты XML.

Андроид: атрибут силы тяжести используется для организации позиции содержания внутри зрения (например , текст внутри кнопки виджета).

Андроид:layout_gravity используются для организации положения всего Посмотреть относительно него в контейнер.

Более подробную информацию вы можете увидеть по этой ссылке .

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

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

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

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

android:gravity

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

android:layout_gravity 

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

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

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

Другие вопросы по тегам