Ответ 1
Их имена должны помочь вам:
-
android:gravity
задает гравитацию содержимого (т.е. он рассматривает) используемогоView
. -
android:layout_gravity
задает гравитациюView
илиLayout
относительно его родителя.
И вот пример здесь.
Я знаю, что мы можем установить следующие значения в свойства android:gravity
и android:layout_gravity
:
center
center_vertical
center_horizontal
и т.д.Но я смущен в отношении обоих этих.
В чем разница между использованием android:gravity
и android:layout_gravity
?
Их имена должны помочь вам:
android:gravity
задает гравитацию содержимого (т.е. он рассматривает) используемого View
.android:layout_gravity
задает гравитацию View
или Layout
относительно его родителя.И вот пример здесь.
android:layout_gravity
- это внешняя гравитация вида. Указывает направление, в котором вид должен касаться родительской границы.
android:gravity
- это внутренняя гравитация этого вида. Указывает, в каком направлении его содержимое должно выровняться.
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
Возьмите layout-gravity
как "Lay-outside-gravity".
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 упорядочивает представление в макете . Гравитация упорядочивает содержимое внутри представления.
Вот ваш 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: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.
Из того, что я могу собрать layout_gravity, является серьезность этого представления внутри его родителя, а гравитация - это тяжесть детей внутри этого вида.
Я думаю, что это правильно, но лучший способ узнать - это поиграть.
Посмотрите на изображение, чтобы быть понятным о гравитации
Хотя вопрос уже ответил, у меня есть несколько примеров, демонстрирующих использование гравитации, layout_gravity и layout_weight.
Примеры можно найти в http://juanpickselov.com/LayoutExamples.zip
Я создал файлы в Eclipse, удалил подпапки .svn и включил стили, строки, цвета и т.д. Файлы макетов являются основной темой демонстраций. Поскольку я являюсь разработчиком Java и Android, можно найти Java неэффективным. Файлы могут быть скопированы в проект Eclipse или я также использовал их в Netbeans с плагином разработки Android, доступным для этой среды разработки.
Если мы хотим установить серьезность содержимого внутри представления, мы будем использовать "android: gravity", и если мы хотим установить серьезность этого представления (в целом) в его родительском представлении, мы будем использовать "андроид: layout_gravity".
Просто подумал, что я добавлю свое объяснение здесь - исходя из фона на iOS, вот как я усвоил эти два термина iOS: "Макет Gravity" влияет на вашу позицию в супервизии. "Гравитация" влияет на положение ваших подзонов внутри вас. С другой стороны, Layout Gravity позиционирует вас самостоятельно, в то время как гравитация позиционирует ваших детей.
Что-то, что я видел в блоге Sandip, которое я почти пропустил, исправил мою проблему. Он сказал, что layout_gravity
НЕ РАБОТАЕТ с LinearLayout
.
Если вы используете LinearLayout
, а настройки гравитации приводят вас в орехи (как и я), переключитесь на что-то еще.
Я фактически переключился на RelativeLayout
, а затем использовал layout_alignParentLeft
и layout_alignParentRight
на 2, содержащий TextView
, чтобы получить их в одной строке, чтобы идти далеко влево и вправо.
В 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>
Вывод: -
Использование силы тяжести и силы тяжести в 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>
Вывод: -
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
в ту же позицию....
android:gravity
используется, чтобы указать, как разместить содержимое объекта внутри самого объекта. Другими словами, андроид: гравитация используется для определения тяжести содержимого представления.
android:layout_gravity
- это атрибуция, которую ребенок может предоставить своему родителю, чтобы определить силу тяжести вида внутри своих родителей.
Более подробную информацию вы можете найти
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
Основное различие между ними состоит в том, что -
андроид: гравитация используется для дочерних элементов представления.
android: layout_gravity используется для этого элемента относительно родительского представления.
Легкий трюк, чтобы помнить, что это сила тяжести, применима к нам внутри Земли. Итак, android:gravity
для внутри.
Вспомните out в out _gravity, который поможет вам вспомнить, что android:layout_gravity
будет ссылаться на вне вид
Гравитация используется для установки выравнивания текста в представлениях, но layout_gravity используется для установки представлений. Давайте возьмем пример, если вы хотите выровнять текст, написанный в editText, затем использовать гравитацию, и вы хотите выровнять этот editText или любую кнопку или любое представление, а затем использовать layout_gravity, поэтому его очень просто.
gravity: используется для простых представлений, таких как textview, edittext и т.д.
layout_gravity: используется для текущего представления только гравитации в контексте относительного родительского представления, такого как линейный макет или FrameLayout, чтобы сделать вид в центре или любой другой серьезностью его родителя.
Гравитация: позволяет перемещать содержимое внутри контейнера. (Как будут отображаться подвидки).
Важно: (перемещайтесь вдоль оси 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 будет перемещаться. (здесь также применяется вся концепция)
android:gravity
используется для настройки содержимого представления относительно его заданной позиции (выделенной области). android:gravity="left"
ничего не сделал бы, если layout_width
равен "wrap_content"
android:layout_gravity
используется для представления относительно родительского или файла макета.
android:gravity
→ Устанавливает плотность содержимого View, в котором он используется.
android:layout_gravity
→ Устанавливает его гравитационный вид или макет