У чому різниця між гравітацією та макетністю_гравітації в Android?


1328

Я знаю, що ми можемо встановити такі значення android:gravityта android:layout_gravityвластивості:

  1. center
  2. center_vertical
  3. center_horizontalтощо.

Але я збентежений щодо обох цих питань.

Яка різниця між використанням android:gravityта android:layout_gravity?


265
Легкий трюк, який потрібно запам’ятати: візьміть «макет-гравітація» як «накладення гравітації»
Вішну Харідас

6
center == center_vertical | center_horizontal
Yousha Aleayoub

4
Ці відео дуже допомогли мені зрозуміти різницю: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro

ImageViewЗдається, веде себе інакше, ніж TextView's.
Саміс

Відповіді:


1346

Їх імена повинні допомогти вам:

  • android:gravityвстановлює ступінь тяжкості вмісту (тобто його підпогляду) Viewвикористовуваного.
  • android:layout_gravityвстановлює тяжкість Viewабо Layoutвідносно його батьківського.

І прикладом може служити тут .


88
В основному, все з layout_визначає щось, що впливає на елементи зовні.
Triang3l

29
Розумієте, я вважаю це смішним, тому що якщо я просто відійду від імен, моя інтуїція навпаки. Кожен раз, я думаю, що "layout_gravity" означає "тяжкість для того, як ця ViewGroup викладає вміст", а "gravity" - це "де цей погляд тяжіє до".
Огре

15
Отже, що відбувається, якщо android:gravityвстановлено ліворуч, а його дітей android:layout_gravityвстановлено праворуч? до якої сторони вирівнятимуться діти?
Thupten

2
Як @Suragch прокоментував свою відповідь, layout_gravity працює лише в LinearLayout та FrameLayout. LinearLayout має обмеження щодо цього.
Marco Luglio

1
@Thupten Дуже добре запитання. Я думаю, що одна буде переважати (я думаю, що дитяча layout_gravity), а інша - лише типова для переважаючої.
Триларіон

522

Всередині зовні

  • gravityупорядковує вміст всередині перегляду.
  • layout_gravityвпорядковує позицію погляду поза собою.

Іноді це також допомагає побачити картину. Зелений і синій є, TextViewsа два інших кольори фону є LinearLayouts.

введіть тут опис зображення

Примітки

  • Значення layout_gravityне працює для переглядів у a 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>

Пов'язані


здається більш легким після того, як його візуально побачили, завдяки Сурагчу.
Харіцин Гохіль

466

Різниця

android:layout_gravity- зовнішня сила тяжіння Погляду. Вказує напрямок, у якому Вид повинен торкатися межі батьків.

android:gravityє Усередині вагою цього виду. Вказує, в якому напрямку повинен вирівнюватися його вміст.

HTML / CSS еквіваленти

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

Легкий трюк, який допоможе вам запам'ятати

Візьміть layout-gravityяк "Покладання поза гравітацією".


це має більше сенсу, коли у вас є фон для веб-розробок.
Харісінь Гохіль

40

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

Довга історія: для управління силою тяжіння в контейнері з лінійною компонуванням, таким як LinearLayoutабо RadioGroup, є два підходи:

1) Для контролю тяжкості ВСІХ дитячих представлень 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не має ніякого ефекту. Вертикальна гравітація за замовчуванням - це центр (або центр_вертика) і може змінюватися вгорі або внизу. Насправді layout_gravityзначенням за замовчуванням є, -1але Android поставив його по центру вертикально.

Для зміни горизонтальних позицій дитячих поглядів у горизонтальному лінійному контейнері можна використовувати layout_weight, поле та накладку дитячого подання.

Аналогічно, для контейнера з вертикальною групою перегляду вертикальна гравітація його дочірнього виду розташована у верхній частині одна під одною і не може бути змінена. За замовчуванням горизонтальна гравітація є центром (або center_horizontal) і може бути змінена вліво або вправо.

Насправді, дочірній вигляд, такий як кнопка, також має android:gravityатрибут XML та setGravity()спосіб керування його дочірніми переглядами - текст у ньому. Посилання Button.setGravity(int)пов'язане з цим записом developer.android.com .


36

З того, що я можу зібрати layout_gravity, це гравітація цього погляду всередині його батьківського, а гравітація - це сила тяжіння дітей всередині цього погляду.

Я думаю, що це правильно, але найкращий спосіб дізнатися це - пограти.



12

Якщо ми хочемо встановити тяжкість вмісту всередині подання, тоді ми будемо використовувати "android: gravity", а якщо ми хочемо встановити тяжкість цього подання (в цілому) в його батьківському поданні, тоді ми будемо використовувати "android: макет_гравітація ".


8

Я просто подумав, що я додам тут власне пояснення - виходячи з фону на iOS, ось як я інтерналізував їх у термінах iOS: "Гравітація макета" впливає на вашу позицію в нагляді. "Гравітація" впливає на позицію ваших підглядів всередині вас. Сказав іншим способом: Layout Gravity позиціонує вас самих, а гравітація - ваші діти.


7

У gravityта layout-gravity. Я збираюся пояснити свій досвід щодо цих двох концепцій ( Вся інформація, яку я отримала завдяки моїм спостереженням та на деяких веб-сайтах ).

Використання гравітації та гравітації в FrameLayout.....

Примітка:-

  1. Гравітація використовується всередині перегляду вмісту, оскільки відповідь деяких користувачів є однаковою для всіх ViewGroup Layout.

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

  3. Gravity and Layout-gravityце корисніше працювати з FrameLayoutдітьми. We can't use Gravity and Layout-gravityв тезі FrameLayout ....

  4. Ми можемо встановити Child View будь-де, де FrameLayoutвикористовується layout-gravity.

  5. Ми можемо використовувати кожне окреме значення сили тяжіння всередині FrameLayout (наприклад: - center_vertical, center_horizontal, center, top, і т.д.), але це не можливо з іншими ViewGroup макетами.

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

Вихід: -

g1

Використання тяжкості та гравітації макета в LinearLayout .....

GravityПрацюючи так само, як вище, але тут різниця полягає в тому, що ми можемо використовувати Gravity всередині, LinearLayout Viewа RelativeLayout Viewщо неможливо в FrameLayout View.

Лінійний макет з вертикальною орієнтацією ....

Примітка: - Тут ми можемо встановити лише 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

Лінійний макет з орієнтацією по горизонталі ....

Примітка: - Тут ми можемо також встановити 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Чайлдс в такому ж положенні ....


1
Якщо ви встановите textColorбілий колір, viewто це було б дуже здорово. : D
Пратік Бутані

Ти впевнений? Це буде виглядати чорно-білим, тому я використовував різний колір для кожного перегляду.
sushildlh

6

Легкий трюк, щоб пам’ятати про це - гравітація стосується нас всередині землі. Отже, android:gravityє для внутрішнього вигляду.

Rememeber з від'їздом в скручування з _gravity , які допомогли б , щоб ви запам'ятали , що android:layout_gravityбуде посилатися поза точки зору


5

Щось, що я побачив у блозі Сандіпа, що я майже пропустив, вирішив свою проблему. Він сказав, що layout_gravityНЕ ПРАЦЮЄ LinearLayout.

Якщо ви користуєтесь a, LinearLayoutа налаштування сили тяжіння збивають вас (як я), тоді переключіться на щось інше.

Я фактично перейшов на використовуваний RelativeLayoutтоді layout_alignParentLeftі layout_alignParentRightна 2 містяться TextViews, щоб отримати їх на одній лінії, щоб піти вліво і вправо.


4

Основна різниця між ними -

android: гравітація використовується для дочірніх елементів зору.

android: layout_gravity використовується для цього елемента стосовно батьківського подання.


3

android:gravityвикористовується для вказівки, як розмістити вміст об'єкта всередині самого об’єкта. Іншим словом, android: гравітація використовується для визначення тяжкості вмісту виду.

android:layout_gravity це ознака, яку дитина може надати своєму батькові, щоб визначити тяжкість погляду у своїх батьків.

Більш детальну інформацію ви можете відвідати

http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html


2
Я думаю, що немає необхідності в новій відповіді, оскільки є кілька відповідей, які вже розміщені, і майже з однаковим вмістом висвітлено!
Paresh Mayani

3

Гравітація: Дозволяє переміщувати вміст всередині контейнера. (Як будуть розміщені підпогляди).

Важливо: (Перемістіть по осі X або по осі Y в межах доступного простору).

Приклад: Скажімо, якщо ви працювали з LinearLayout (Висота: match_parent, Ширина: match_parent) як елемент кореневого рівня, тоді у вас буде повний простір кадрів; і дочірнє уявлення говорить про те, що 2 TextViews (Висота: wrap_content, Ширина: wrap_content) всередині LinearLayout можна переміщувати по осі x / y, використовуючи відповідні значення сили тяжіння для батьків.

Layout_Gravity: Дозволяє переосмислювати поведінку батьківського гравітації ТІЛЬКИ по осі x.

Важливо: (ПОВЕРНУТИСЯ [перевизначення] вздовж осі X у межах доступного простору).

Приклад: Якщо ви пам’ятаєте про попередній приклад, ми знаємо, що гравітація дозволила нам рухатись по осі x / y, тобто; місце TextViews всередині LinearLayout. Скажімо, LinearLayout вказує тяжкість: центр; тобто кожен TextView повинен бути центром як вертикально, так і горизонтально. Тепер, якщо ми хочемо, щоб один з TextView пішов вліво / вправо, ми можемо змінити вказану поведінку гравітації, використовуючи layout_gravity на TextView.

Бонус: якщо ви копаєтеся глибше, ви дізнаєтесь, що цей текст у TextView виступає як підвид; тож якщо застосувати гравітацію до TextView, текст всередині TextView переміститься. (вся концепція застосовується і тут)


1

Гравітація використовується для встановлення вирівнювання тексту у видах, але layout_gravity - це використання для встановлення представлень. Давайте візьмемо приклад, якщо ви хочете вирівняти текст, написаний у editText, тоді використовуйте гравітацію, і ви хочете вирівняти цей editText або будь-яку кнопку або будь-який вид, а потім використовувати layout_gravity, Отже, це дуже просто.


1

гравітація : використовується для простих переглядів, таких як перегляд тексту, редагування тексту тощо.

layout_gravity : використовується лише для поточного перегляду гравітації в контексті його відносного батьківського виду, такого як лінійний макет або FrameLayout, щоб зробити вигляд у центрі або будь-який інший гравітації його батьківського.


layout_gravity: використовується для поточного перегляду лише гравітації в контексті відносного батьківського, а не інших поглядів, які знаходяться всередині його батьківського.
Чінтак Патель

0
android:gravity

використовується для регулювання вмісту перегляду щодо його заданої позиції (виділена область). android:gravity="left" не зробив би нічого, якщо layout_widthдорівнює"wrap_content"

android:layout_gravity 

використовується для перегляду самого по відношенню до батьківського файлу чи файлу макета.


0

android:gravity -> Встановлює тяжкість вмісту Перегляду, який він використовує.

android:layout_gravity -> Встановлює тяжкість виду батьків або макета


0

гравітація - застосовується до власного погляду.

layout-gravity --- Застосовується для перегляду, пов'язаного з його батьківським.


0

The android:gravityВстановлює тяжкість (положення) дітей , в той час як android:layout_gravityвстановлює позицію самого виду. Сподіваюся, це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.