Вопрос: Разница между гравитацией и layout_gravity на Android


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

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

Но я смущен в отношении обоих.

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


1126


источник


Ответы:


Их имена должны помочь вам:

  • android:gravityустанавливает гравитацию содержимого (то есть его подвид) Viewон используется.
  • android:layout_gravityустанавливает гравитацию Viewили Layoutотносительно его родителя.

И пример Вот ,


1181



Разница

android:layout_gravityэто за пределами гравитация вида. Указывает направление, в котором вид должен касаться границы его родителя.

android:gravityэто внутри гравитация этого вида. Указывает, в каком направлении его содержимое должно выровняться.

Эквиваленты HTML / CSS

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align

Легкий трюк, который поможет вам запомнить

принимать layout-gravityкак «Lay-outside-gravity».


442



Внутри снаружи

  • gravityупорядочивает контент внутри вид.
  • layвне _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 упорядочивает представление в своем расположение , Гравитация упорядочивает содержимое внутри представления.

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>

Связанный


425



Краткий ответ: использование android:gravityили setGravity()контролировать гравитацию всех видов ребенка в контейнере; использование android:layout_gravityили setLayoutParams()для контроля силы тяжести отдельного вида в контейнере.

Длинная история: контролировать гравитацию в контейнере с линейной компоновкой, например LinearLayoutили RadioGroup, существует два подхода:

1) Чтобы контролировать тяжесть ВСЕХ детских просмотров LinearLayoutконтейнер (как и в вашей книге), используйте android:gravity(не android:layout_gravity) в формате XML-файла или setGravity()метод в коде.

2) Чтобы контролировать гравитацию детского вида в контейнере, используйте android:layout_gravityXML-атрибут. В коде нужно получить 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:gravityXML-атрибут и setGravity()метод управления своими дочерними представлениями - текст в нем. Button.setGravity(int)связано с этим Закладка developer.android.com ,


35



Из того, что я могу собрать layout_gravity является гравитацией этого представления внутри его родителя и сила тяжести это гравитация детей внутри этой точки зрения.

Я думаю, что это правильно, но лучший способ узнать - это поиграть.


31



Посмотрите на изображение, чтобы быть понятным о гравитации


22



Хотя вопрос уже ответил, у меня есть несколько примеров, демонстрирующих использование гравитации, layout_gravity и layout_weight.

Вы можете найти примеры на http://juanpickselov.com/LayoutExamples.zip

Я создал файлы в Eclipse, удалил подпапки .svn и включил стили, строки, цвета и т. Д. Файлы макетов являются основной темой демонстраций. Поскольку я являюсь разработчиком Java и Android, можно найти Java неэффективным. Файлы могут быть скопированы в проект Eclipse или я также использовал их в Netbeans с плагином разработки Android, доступным для этой среды разработки.


10



If a we want to set the gravity of content inside a view then we will use "android:gravity", and if we want to set the gravity of this view (as a whole) within its parent view then we will use "android:layout_gravity".


9



Just thought I'd add my own explanation here - coming from a background on iOS, this is how I've internalized the two in iOS terms: "Layout Gravity" affects your position in the superview. "Gravity" affects the position of your subviews within you. Said another way, Layout Gravity positions you yourself while gravity positions your children.


6



Something I saw on Sandip's blog that I almost missed, fixed my problem. He said layout_gravity DOES NOT WORK WITH LinearLayout.

If you're using a LinearLayout and the gravity settings are driving you nuts (like me), then switch to something else.

I actually switched to a RelativeLayout then used layout_alignParentLeft and layout_alignParentRight on the 2 contained TextViews to get them on one line to go far left and far right.


3



There is many difference in the gravity and layout-gravity. I am going to explain my experience about these 2 concepts(All information i got due to my observation and some websites).

Use Of Gravity and Layout-gravity in FrameLayout .....

Note:-

  1. Gravity is used inside the View Content as some User have answer and it is same for all ViewGroup Layout.

  2. Layout-gravity is used with the parent View as some User have answer.

  3. Gravity and Layout-gravity is work more useful with the FrameLayout childs . We can't use Gravity and Layout-gravity in FrameLayout's Tag ....

  4. We can set Child View any where in the FrameLayout using layout-gravity .

  5. We can use every single value of gravity inside the FrameLayout (eg:- center_vertical, center_horizontal, center,top, etc), but it is not possible with other ViewGroup Layouts .

  6. FrameLayout fully working on Layout-gravity. Example:- If you work on FrameLayout then you don't need to change whole Layout for adding new View. You just add View as last in the FrameLayout and give him Layout-gravity with value.(This is adavantages of layout-gravity with FrameLayout).

have look on example ......

<?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>

Output:-

g1

Use Of Gravity and Layout-gravity in LinearLayout .....

Gravity working same as above but here differnce is that we can use Gravity inside the LinearLayout View and RelativeLayout View which is not possible in FrameLayout View.

LinearLayout with orientation vertical ....

Note:- Here we can set only 3 values of layout_gravity that is (left | right | center (also called center_horizontal)).

have look on example :-

<?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>

Output:-

g2

LinearLayout with orientation horizontal ....

Note:- Here we can set also 3 values of layout_gravity that is (top | bottom | center (also called center_vertical)).

have look on example :-

<?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>

output:-

g3

Note:- We can't use layout_gravity in the RelativeLayout Views but we can use gravity to set RelativeLayout childs to same position....


3