Разницу между силой тяжести и макет гравитация на Андроид


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

  1. center
  2. center_vertical
  3. center_horizontal и т. д.

но я в замешательстве относительно обоих из них.

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

19 1166

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

Примечания

  • The layout_gravity не работает для представлений в RelativeLayout. Используйте его для просмотра в LinearLayout или FrameLayout. Смотрите мой дополнительный ответ для более подробной информации.
  • ширина (или высота) представления должна быть больше, чем его содержимое. В противном случае gravity не будет иметь никакого эффекта. Таким образом,wrap_content и gravity бессмысленны вместе.
  • ширина вида (или высота) должно быть меньше, чем у родителя. В противном случае layout_gravity не будет иметь никакого эффекта. Таким образом,match_parent и layout_gravity бессмысленны вместе.
  • The 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>

по теме

короткий ответ: используйте 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 до center_horizontal не имеет никакого эффекта. Этот по умолчанию вертикальная гравитация является центральной (или center_vertical) и может быть изменена на верхнюю или нижнюю. На самом деле по умолчанию layout_gravity значение -1 но Android поставил его центр вертикально.

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

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

помнят из на лежализ _гравитация который поможет вам вспомнить, что 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, т. е.; место TextViews внутри Макетом. Скажем, 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 - > устанавливает гравитацию родительского вида или макета