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

1209

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

  • center
  • center_vertical
  • center_horizontal и т.д.

Но я смущен в отношении обоих этих.

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

  • 246
    Легкий трюк для запоминания: примите «макет-гравитация» как «Lay-outside-gravity»
  • 6
    center == center_vertical | center_horizontal
Показать ещё 2 комментария
Теги:
android-layout

19 ответов

1261
Лучший ответ

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

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

И вот пример здесь.

  • 77
    По сути, все с layout_ определяет то, что влияет на элементы снаружи.
  • 23
    Видите ли, я нахожу это забавным, потому что, если я просто уйду от имен, моя интуиция будет наоборот. Каждый раз, я думаю, что layout_gravity означает «гравитацию того, как эта ViewGroup выкладывает свое содержимое», а «gravity» - это «куда стремится это представление».
Показать ещё 5 комментариев
457

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

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

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

Изображение 2793

Примечания

  • 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 упорядочивает представление в макете . Гравитация упорядочивает содержимое внутри представления.

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>

Связанные

424

Разница

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

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

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

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

Легкий трюк, который поможет вам запомнить

Возьмите layout-gravity как "Lay-outside-gravity".

36

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

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

1) Чтобы контролировать гравитацию всех дочерних представлений контейнера LinearLayout (как и в вашей книге), используйте android:gravity (not 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 не влияет. По умолчанию вертикальная гравитация - центральная (или центральная) и может быть изменена на верхнюю или нижнюю. Фактически значение по умолчанию layout_gravity равно -1, но Android поместил его по вертикали.

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

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

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

31

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

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

23

Изображение 2794

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

10

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

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

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

  • 2
    Каким-то образом, через два с половиной года пример ссылки приводит к 404.
9

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

6

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

3

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

Использование силы тяжести и силы тяжести в FrameLayout.....

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

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

  • layout-gravity используется с родительским представлением, поскольку у некоторых пользователей есть ответ.

  • Gravity and Layout-gravity работает более полезно с дочерними элементами FrameLayout. We can't use Gravity and Layout-gravity в теге FrameLayout....

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

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

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

Вывод: -

Изображение 2795

Использование силы тяжести и силы тяжести в LinearLayout.....

gravity работает так же, как и выше, но здесь отличается то, что мы можем использовать 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>

Вывод: -

Изображение 2796

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>

вывод: -

Изображение 2797

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

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

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

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

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

2

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

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

2

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

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

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

2

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

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

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

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

  • 2
    Я думаю, что нет необходимости в новом ответе, поскольку уже опубликовано несколько ответов с почти одинаковым содержанием!
1

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

Важно: (перемещайтесь вдоль оси X или оси Y в пределах доступного пространства).

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

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

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

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

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

1

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

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

  • 0
    layout_gravity: используется для гравитации текущего представления только в контексте его относительного родителя, а не для других представлений, которые находятся внутри его родителя.
1

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

0

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

android:layout_gravity → Устанавливает его гравитационный вид или макет

0
android:gravity

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

android:layout_gravity 

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню