What is the difference between gravity and layout_gravity in Android?
Я знаю, что мы можем установить следующие значения android:gravity
а также android:layout_gravity
свойства:
center
center_vertical
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
.....
Заметка:-
Гравитация используется внутри просмотра содержимого, так как некоторые пользователи имеют ответ, и она одинакова для всех
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>
Выход:-
Использование 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>
Выход:-
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>
выход:-
Примечание: - Мы не можем использовать layout_gravity
в RelativeLayout Views
но мы можем использовать gravity
установить RelativeLayout
Чайлдс в той же позиции....
То, что я увидел в блоге Сандипа, которое я почти пропустил, решило мою проблему. Он сказал layout_gravity
НЕ РАБОТАЕТ С LinearLayout
,
Если вы используете LinearLayout
и настройки гравитации сводят вас с ума (как я), а затем переключиться на что-то еще.
Я на самом деле перешел на RelativeLayout
затем использовал layout_alignParentLeft
а также layout_alignParentRight
на 2 содержал TextView
s, чтобы получить их на одной линии, чтобы идти далеко налево и далеко направо.
Основное различие между ними заключается в том, что
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 --- Применяется к представлению, связанному с его родителем.