Разница между гравитацией и гравитацией макета на Android
Я знаю, что мы можем установить следующие значения android:gravity
и android:layout_gravity
свойства:
center
center_vertical
-
center_horizontal
, etc.
но я смущен в отношении обоих из них.
в чем разница между использованием android:gravity
и android:layout_gravity
?
19 ответов
их имена должны помочь вам:
-
android:gravity
устанавливает серьезность содержимого (т. е. его подвидов)View
Он используется. -
android:layout_gravity
устанавливает гравитациюView
илиLayout
относительно его родителя.
и пример здесь.
разница
android:layout_gravity
это за пределами гравитация вида. Указывает направление, в котором представление должно касаться границы своего родителя.
android:gravity
- это внутри гравитация этого вида. Указывает, в каком направлении должно выравниваться его содержимое.
эквиваленты HTML/CSS
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 устраивает вид в своем планировка. 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:gravity
или setGravity()
для управления гравитацией всех дочерних представлений контейнера; используйте android:layout_gravity
или setLayoutParams()
для управления гравитацией отдельного вида в контейнере.
длинная история: для управления гравитацией в линейном контейнере макета, таком как LinearLayout
или RadioGroup
, есть два подхода:
1) для управления гравитацией всех дочерних представлений a 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
to center_horizontal
не имеет никакого эффекта. Этот вертикальная гравитация по умолчанию является центральной (или center_vertical) и может быть изменена на верхнюю или нижнюю. На самом деле по умолчанию layout_gravity
значение -1
но Android поставил его в центр вертикально.
чтобы изменить горизонтальное положение дочерних представлений в горизонтальном линейном контейнере, можно использовать layout_weight
, margin и padding мнение ребенка.
аналогично, для контейнера группы вертикального вида вертикальная гравитация его дочернего вида выровнена сверху вниз и не может быть измененный. Горизонтальная гравитация по умолчанию-center (или center_horizontal
) и может быть изменен влево или вправо.
на самом деле, дочерний вид, такой как кнопка, также имеет android:gravity
атрибут XML и setGravity()
метод управления дочерними представлениями -- текст в нем. The 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, доступным для этой IDE.
Если мы хотим установить гравитацию содержимого внутри представления, мы будем использовать "android: gravity", и если мы хотим установить гравитацию этого представления (в целом) в его родительском представлении, то мы будем использовать"android:layout_gravity".
просто подумал, что я добавлю свое собственное объяснение здесь-исходя из фона на iOS, вот как я усвоил эти два термина в iOS: "гравитация макета" влияет на вашу позицию в супервизоре. "Гравитация" влияет на положение ваших подвидов внутри вас. Иначе говоря, макет тяжести позиции вы себя при гравитационном позиций ваших детей.
существует много различий в gravity
и layout-gravity
. Я собираюсь объяснить свой опыт об этих 2 понятиях (вся информация, которую я получил из-за моего наблюдения и некоторых веб-сайтов).
использование гравитации и компоновки-гравитация в
FrameLayout
.....
Примечание:
гравитация используется внутри Просмотр Содержимого как у некоторых пользователей есть ответ и он такой же для всех
ViewGroup Layout
.Layout-gravity
используется с родительским представлением, поскольку у некоторых пользователей есть ответ.Gravity and Layout-gravity
и работа более полезная СFrameLayout
Чайлдс .We can't use Gravity and Layout-gravity
в теге FrameLayout ....мы можем установить Дочерний вид в любом месте в
FrameLayout
используяlayout-gravity
.мы можем использовать каждое одиночное значение силы тяжести внутри FrameLayout (например: -
center_vertical
,center_horizontal
,center
,top
и т. д.), Но это невозможно с другими макетами ViewGroup .FrameLayout
наLayout-gravity
. Пример: - Если вы работаете наFrameLayout
затем не нужно менять весь план для добавления нового представления. Ты просто добавить вид как последний вFrameLayout
и дал емуLayout-gravity
С значение.(это adavantages макета-гравитации с 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
работает так же, как и выше, но здесь разницу в том, что мы можем использовать гравитацию внутри 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
и настройки гравитации сводят вас с ума (как и я), а затем переключитесь на что-то другое.
я фактически переключился на используется layout_alignParentLeft
и layout_alignParentRight
на 2 содержатся TextView
s, чтобы получить их на одной линии, чтобы перейти левой и правой.
легкий трюк, чтобы помнить, что это гравитация относится к нам внутри Земли. Итак,android:gravity
на внутри вид.
помнят из на лежализ_gravity что поможет вам запомнить это android:layout_gravity
будет относиться к за пределами вид
android:gravity
используется для указания того, как разместить содержимое объекта внутри самого объекта. Другими словами, android: gravity используется для указания тяжести содержимого представления.
android:layout_gravity
является атрибуцией, которую ребенок может предоставить своему родителю, чтобы указать серьезность представления внутри своих родителей.
для более подробной информации вы можете посетить
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
основное различие между ними заключается в том, что -
android:гравитация используется для дочерних элементов представления.
android: layout_gravity используется для этого элемента относительно родительского вида.
серьезность: позволяет перемещать содержимое внутри контейнера. (Как будут размещены подвиды).
важно: (перемещение вдоль оси X или оси Y в пределах доступного пространства).
пример: предположим, если вы должны были работать с LinearLayout (Height: match_parent, Width: match_parent) в качестве элемента корневого уровня, то у вас будет полное пространство кадра; и дочерние представления говорят 2 TextViews (Height: wrap_content, Width: wrap_content) внутри LinearLayout можно двинуть вокруг вдоль оси x/y используя соответствуя значения для силы тяжести на родителе.
Layout_Gravity: позволяет переопределить родительское поведение гравитации только вдоль оси X.
важно: (перемещение[переопределение] вдоль оси X в пределах доступного пространства).
пример: Если вы помните предыдущий пример, мы знаем, что гравитация позволила нам двигаться вдоль оси x/y, i.e; место TextViews внутри LinearLayout. Скажем, LinearLayout указывает gravity: center; то есть каждый TextView должен быть центром как по вертикали, так и по горизонтали. Теперь, если мы хотим, чтобы один из TextView шел влево/вправо, мы можем переопределить указанное поведение гравитации, используя layout_gravity в TextView.
бонус: Если вы копнете глубже, вы обнаружите, что текст в TextView действует как под-вид; поэтому, если вы примените гравитацию на TextView, текст внутри TextView будет перемещаться. (вся концепция применима и здесь)
гравитация используется для установки выравнивания текста в представлениях, но layout_gravity используется для установки представлений. Давайте возьмем пример, если вы хотите выровнять текст, написанный в editText, а затем использовать гравитацию, и вы хотите выровнять этот editText или любую кнопку или любое представление, а затем использовать layout_gravity, поэтому его очень просто.
гравитация: используется для простых представлений, таких как textview, edittext и т. д.
layout_gravity: используется для текущего вида только гравитации в контексте его относительного родительского вида, такого как линейный макет или FrameLayout, чтобы сделать вид в центре или любой другой гравитации его родителя.
android:gravity
используется для настройки содержимого представления относительно его заданной позиции (выделенной области). android:gravity="left"
не сделал бы ничего, если layout_width
равна "wrap_content"
android:layout_gravity
используется для самого представления относительно родительского файла или файла макета.
android:gravity
- > устанавливает серьезность содержимого вида, на котором он используется.
android:layout_gravity
- > устанавливает гравитацию родительского вида или макета