Разница между гравитацией и гравитацией макета на Android

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

  1. center
  2. center_vertical
  3. 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.

enter image description here

Примечания

  • на 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 .....

Примечание:

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

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

  3. Gravity and Layout-gravity и работа более полезная С FrameLayout Чайлдс . We can't use Gravity and Layout-gravity в теге FrameLayout ....

  4. мы можем установить Дочерний вид в любом месте в FrameLayout используя layout-gravity .

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

  6. 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>

выход:-

g1

использование гравитации и компоновки-гравитация в 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 и настройки гравитации сводят вас с ума (как и я), а затем переключитесь на что-то другое.

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


легкий трюк, чтобы помнить, что это гравитация относится к нам внутри Земли. Итак,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 - > устанавливает гравитацию родительского вида или макета