Jaka jest różnica między grawitacją a rozkładem_grawitacji w systemie Android?

1328

Wiem, że możemy ustawić następujące wartości dla właściwości android:gravityi android:layout_gravity:

  1. center
  2. center_vertical
  3. center_horizontalitp.

Ale jestem zdezorientowany, jeśli chodzi o oba z nich.

Jaka jest różnica między użyciem android:gravitya android:layout_gravity?

Paresh Mayani
źródło
265
Łatwa sztuczka, aby pamiętać: wziąć "układ grawitacji" jako "Lay-outside-grawitacji"
Vishnu Haridas
6
center == center_vertical | center_horizontal
Yousha Aleayoub
4
Te filmy bardzo mi pomogły zrozumieć różnicę: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro
ImageViewwydają się zachowywać inaczej niż TextView.
samis

Odpowiedzi:

1346

Ich imiona powinny ci pomóc:

  • android:gravityustawia grawitację zawartości (tj. jej widoków podrzędnych) Viewużywanego.
  • android:layout_gravityustawia grawitację Viewlub Layoutwzględem jego rodzica.

I przykład jest tutaj .

Sephy
źródło
88
Zasadniczo wszystko z layout_definiuje coś, co wpływa na elementy na zewnątrz.
Triang3l
29
Rozumiem, że to zabawne, bo jeśli po prostu wykreślę nazwiska, moja intuicja będzie odwrotna. Za każdym razem myślę, że „layout_gravity” oznacza „grawitację tego, w jaki sposób ViewGroup określa jej zawartość”, a „grawitacja” to „miejsce, w którym ten View grawituje”.
Ogre
15
Co więc się stanie, jeśli android:gravityzestaw zostanie ustawiony w lewo, a jego dzieci android:layout_gravityustawione w prawo? do której strony dzieci się dopasują?
Thupten
2
Jak @Suragch skomentował swoją odpowiedź, layout_gravity działa tylko w LinearLayout i FrameLayout. LinearLayout ma jednak ograniczenia.
Marco Luglio,
1
@Thupten Bardzo dobre pytanie. Sądzę, że jeden zwycięży (chyba układ_grawitacji dzieci), a drugi jest tylko domyślny dla dominującego.
Trilarion
522

Wewnątrz zewnątrz

  • gravityporządkuje zawartość w widoku.
  • layout_gravityustawia pozycję widoku poza sobą.

Czasami pomaga też zobaczyć zdjęcie. Są zielony i niebieski, TextViewsa pozostałe dwa kolory tła LinearLayouts.

wprowadź opis zdjęcia tutaj

Notatki

  • layout_gravityNie działa widokami w RelativeLayout. Użyj go do wyświetlania w a LinearLayoutlub FrameLayout. Zobacz moją dodatkową odpowiedź, aby uzyskać więcej informacji.
  • Szerokość (lub wysokość) widoku musi być większa niż jego zawartość. W przeciwnym razie gravitynie będzie żadnego efektu. Tak więc wrap_contenti gravitysą razem bez znaczenia.
  • Szerokość (lub wysokość) widoku musi być mniejsza niż nadrzędna. W przeciwnym razie layout_gravitynie będzie żadnego efektu. Tak więc match_parenti layout_gravitysą razem bez znaczenia.
  • layout_gravity=centerWygląda tak samo jak layout_gravity=center_horizontaltutaj, ponieważ są one w układzie pionowym liniowej. W tym przypadku nie można wyśrodkować w pionie, więc wyśrodkuj layout_gravity=centertylko w poziomie.
  • Ta odpowiedź dotyczyła tylko ustawienia gravityi layout_gravitywidoków w układzie. Aby zobaczyć, co się stanie po ustawieniu gravitysamego układu macierzystego, sprawdź dodatkową odpowiedź , o której wspomniałem powyżej. (Podsumowanie: gravitynie działa dobrze na, RelativeLayoutale może być przydatne w przypadku LinearLayout.)

Pamiętaj więc, że układ _grawitacja porządkuje widok w swoim układzie . Grawitacja porządkuje zawartość w widoku.

xml

Oto xml dla powyższego obrazu w celach informacyjnych:

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

Związane z

Suragch
źródło
dzięki wizualnemu wyglądowi wydaje się to łatwiejsze, dzięki Suragch.
Haritsinh Gohil
466

Różnica

android:layout_gravityjest zewnętrzną grawitacją widoku. Określa kierunek, w którym widok powinien dotykać granicy jego rodzica.

android:gravityto grawitacja wewnętrzna tego widoku. Określa kierunek, w którym jego zawartość powinna być wyrównana.

Odpowiedniki HTML / CSS

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

Prosta sztuczka, która pomoże Ci zapamiętać

Przyjmij layout-gravityjako „grawitację zewnętrzną”.

Vishnu Haridas
źródło
ma to większy sens, gdy masz doświadczenie w tworzeniu stron internetowych.
Haritsinh Gohil
40

Krótka odpowiedź: użyj android:gravitylub setGravity()do kontroli grawitacji wszystkich widoków podrzędnych kontenera; używać android:layout_gravitylub setLayoutParams()kontrolować grawitację pojedynczego widoku w pojemniku.

Długa historia: aby kontrolować grawitację w kontenerze o układzie liniowym, takim jak LinearLayoutlub RadioGroup, istnieją dwa podejścia:

1) Aby kontrolować grawitację WSZYSTKICH widoków podrzędnych LinearLayoutkontenera (tak jak w książce), użyj android:gravity(nie android:layout_gravity) w pliku XML układu lub setGravity()metody w kodzie.

2) Aby kontrolować grawitację widoku potomnego w jego kontenerze, użyj android:layout_gravityatrybutu XML. W kodzie należy uzyskać LinearLayout.LayoutParamswidok i ustawić jego grawitację. Oto przykład kodu, który ustawia przycisk na dole w poziomo zorientowanym kontenerze:

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);

W przypadku LinearLayoutkontenera poziomego grawitacja pozioma jego widoku potomnego jest wyrównana do lewej jeden po drugim i nie można go zmienić. Ustawienie android:layout_gravityna center_horizontalnie ma wpływu. Domyślna grawitacja pionowa to środek (lub środek_werkalny) i można ją zmienić na górną lub dolną. W rzeczywistości layout_gravitywartością domyślną jest, -1ale Android ustawia ją w pozycji środkowej w pionie.

Aby zmienić poziome pozycje widoków potomnych w poziomym pojemniku liniowym, można użyć layout_weightmarginesu i wypełnienia widoku potomnego.

Podobnie w przypadku pionowego kontenera grupy widoków, pionowy ciężar jego widoku potomnego jest wyrównany do góry jeden pod drugim i nie można go zmienić. Domyślna grawitacja pozioma to środek (lub center_horizontal) i można ją zmienić w lewo lub w prawo.

W rzeczywistości widok potomny, taki jak przycisk, ma również android:gravityatrybut XML i setGravity()metodę kontrolowania jego widoków potomnych - tekstu w nim. Button.setGravity(int)Jest związana z tym wejściem developer.android.com .

Ying
źródło
36

Z tego, co mogę zebrać, układ_grawitacja jest grawitacją tego widoku wewnątrz jego rodzica, a grawitacja jest grawitacją dzieci w tym widoku.

Myślę, że to prawda, ale najlepszym sposobem, aby się tego dowiedzieć, jest zabawa.

matto1990
źródło
29

Spójrz na zdjęcie, aby wyraźnie określić grawitację

Akshay Paliwal
źródło
12

Jeśli chcemy ustawić grawitację zawartości w widoku, użyjemy „android: grawitacja”, a jeśli chcemy ustawić grawitację tego widoku (jako całości) w jego widoku nadrzędnym, użyjemy „android: układ_grawitacji ”.

Abhishek Tamta
źródło
8

Pomyślałem, że dodam tutaj moje własne wyjaśnienie - wywodząc się z tła na iOS, w ten sposób zinternalizowałem je w terminach iOS: „Układ grawitacji” wpływa na twoją pozycję w superwizji. „Grawitacja” wpływa na pozycję twoich podstron w tobie. Mówiąc inaczej, układ grawitacji pozycjonuje ciebie, podczas gdy grawitacja pozycjonuje twoje dzieci.

mszaro
źródło
7

Istnieje wiele różnic w gravityi layout-gravity. Wyjaśnię moje doświadczenie na temat tych 2 pojęć ( wszystkie informacje, które otrzymałem dzięki mojej obserwacji i niektórym stronom internetowym ).

Użycie grawitacji i układu grawitacyjnego w FrameLayout.....

Uwaga:-

  1. Grawitacja jest używana w widoku zawartości, ponieważ niektórzy użytkownicy mają odpowiedź i jest taka sama dla wszystkich ViewGroup Layout.

  2. Layout-gravity jest używany z widokiem nadrzędnym, ponieważ niektórzy użytkownicy mają odpowiedź.

  3. Gravity and Layout-gravityjest praca bardziej przydatna dla FrameLayoutdzieci. We can't use Gravity and Layout-gravityw znaczniku FrameLayout ....

  4. Możemy ustawić Widok dziecka w dowolnym miejscu w FrameLayoutużyciu layout-gravity.

  5. Możemy wykorzystać każdą pojedynczą wartość grawitacji wewnątrz FrameLayout (np: - center_vertical, center_horizontal, center, topitp), ale nie jest to możliwe z innych układów ViewGroup.

  6. FrameLayoutw pełni działa Layout-gravity. Przykład: - Jeśli pracujesz FrameLayout, nie musisz zmieniać całego Układu, aby dodać nowy Widok. Po prostu dodajesz View jako ostatni w FrameLayouti dajesz mu Layout-gravitywartość ( jest to zaleta grawitacji układu dzięki FrameLayout ).

spójrz na przykład ......

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

Wynik:-

g1

Użycie grawitacji i układu grawitacyjnego w LinearLayout .....

Gravitydziałając tak samo jak powyżej, ale tutaj jest różnica, że ​​możemy użyć grawitacji wewnątrz LinearLayout Viewi RelativeLayout Viewco nie jest możliwe w FrameLayout View.

Układ liniowy z orientacją pionową ....

Uwaga: - Tutaj możemy ustawić tylko 3 wartości layout_gravitytego ( left| right| center(również nazywane center_horizontal)).

spójrz na przykład: -

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

Wynik:-

g2

Układ liniowy z orientacją poziomą ....

Uwaga: - Tutaj możemy ustawić również 3 wartości layout_gravitytego (( top| bottom| center(również nazywane center_vertical)).

spójrz na przykład: -

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

wynik:-

g3

Uwaga: - Nie możemy użyć layout_gravityw, RelativeLayout Viewsale możemy gravityustawić RelativeLayoutdziecko w tej samej pozycji ....

sushildlh
źródło
1
Jeśli textColorwe wszystkich ustawisz biel view, byłoby to bardzo świetne. : D
Pratik Butani,
Jesteś pewny? Będzie wyglądał czarno-biały, dlatego użyłem innego koloru dla każdego Widoku.
sushildlh
6

Łatwą sztuczką do zapamiętania jest to, że grawitacja dotyczy nas wewnątrz Ziemi. Tak, android:gravityjest na środku widoku.

Rememeber na out w świeckich out _gravity które pomogą Ci pamiętać, że android:layout_gravityodsyła do zewnątrz widoku

Mahendra Liya
źródło
5

Coś, co zobaczyłem na blogu Sandip, którego prawie przegapiłem, naprawiło mój problem. Powiedział, że layout_gravityNIE PRACUJE LinearLayout.

Jeśli używasz A, LinearLayouta ustawienia grawitacji doprowadzają Cię do szału (jak ja), przełącz się na coś innego.

Właściwie przełączyłem się na RelativeLayoutużywany wtedy layout_alignParentLefti layout_alignParentRightna 2 zawarte TextViews, aby uzyskać je w jednej linii, aby przejść daleko w lewo i daleko w prawo.

JustSomeGuy
źródło
4

Podstawowa różnica między nimi polega na tym, że-

android: grawitacja jest używana w elementach potomnych widoku.

android: układ_grawitacja jest używany dla tego elementu w odniesieniu do widoku rodzica.

Abhishek T.
źródło
3

android:gravitysłuży do określania sposobu umieszczenia zawartości obiektu w samym obiekcie. Innymi słowy, android: grawitacja służy do określenia grawitacji zawartości widoku.

android:layout_gravity to atrybucja, którą dziecko może podać swojemu rodzicowi, aby określić wagę widoku w jego rodzicach.

Aby uzyskać więcej informacji, możesz odwiedzić

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

IntelliJ Amiya
źródło
2
Myślę, że nie ma potrzeby nowej odpowiedzi, ponieważ jest już wiele odpowiedzi z niemal taką samą zawartością!
Paresh Mayani,
3

Grawitacja: pozwala przenosić zawartość wewnątrz kontenera. (Jak zostaną umieszczone widoki podrzędne).

Ważne: (PRZENIEŚ wzdłuż osi X lub osi Y w dostępnej przestrzeni).

Przykład: załóżmy, że jeśli chcesz pracować z LinearLayout (Height: match_parent, Width: match_parent) jako elementem na poziomie katalogu głównego, to będziesz mieć pełną przestrzeń na klatkę; a widoki potomne mówią, że 2 TextViews (Height: wrap_content, Width: wrap_content) wewnątrz LinearLayout można przesuwać wzdłuż osi x / y przy użyciu odpowiednich wartości grawitacji na obiekcie nadrzędnym.

Layout_Gravity: Pozwala na przesłonięcie nadrzędnego zachowania grawitacyjnego TYLKO wzdłuż osi x.

Ważne: (PRZESUŃ [przesłonięcie] wzdłuż osi X w dostępnym miejscu).

Przykład: jeśli pamiętasz o poprzednim przykładzie, wiemy, że grawitacja umożliwiła nam poruszanie się wzdłuż osi x / y, tj. miejsce TextViews wewnątrz LinearLayout. Powiedzmy, że LinearLayout określa grawitację: środek; co oznacza, że ​​każdy TextView musi być wyśrodkowany zarówno pionowo, jak i poziomo. Teraz, jeśli chcemy, aby jeden z TextView przesuwał się w lewo / w prawo, możemy przesłonić określone zachowanie grawitacyjne za pomocą layout_gravity w TextView.

Premia: jeśli zagłębisz się głębiej, przekonasz się, że tekst w TextView działa jako pod-widok; więc jeśli zastosujesz grawitację w TextView, tekst wewnątrz TextView będzie się poruszał. (dotyczy to również całej koncepcji)

Ali Raza
źródło
1

Grawitacja służy do ustawiania wyrównania tekstu w widokach, ale układ_grawitacja służy do ustawiania widoków samodzielnie. Weźmy przykład, jeśli chcesz wyrównać tekst napisany w editText, a następnie użyć grawitacji i chcesz wyrównać ten editText lub dowolny przycisk lub dowolny widok, a następnie użyj layout_gravity, więc jest to bardzo proste.

Praveen Gaur
źródło
1

grawitacja : służy do prostych widoków, takich jak podgląd tekstu, edycja tekstu itp.

layout_gravity : służy do bieżącego widoku tylko grawitacji w kontekście jego względnego widoku macierzystego, takiego jak układ liniowy lub FrameLayout, aby uzyskać widok w środku lub inną grawitację jego rodzica.

Mayank Garg
źródło
layout_gravity: służy do bieżącego widoku tylko grawitacji w kontekście jego względnego elementu nadrzędnego, a nie innych widoków, które znajdują się wewnątrz jego elementu nadrzędnego.
Chintak Patel,
0
android:gravity

służy do dostosowania zawartości widoku względem jego określonej pozycji (przydzielonego obszaru). android:gravity="left" nie zrobiłby nic, jeśli layout_widthjest równy"wrap_content"

android:layout_gravity 

służy do wyświetlania samego względem pliku nadrzędnego lub pliku układu.

Tulsi
źródło
0

android:gravity -> Ustawia grawitację zawartości widoku, na którym jest używany.

android:layout_gravity -> Ustawia grawitację widoku rodzica lub układu

Vamsi
źródło
0

grawitacja - dotyczy własnego widoku.

layout-gravity --- Dotyczy widoku związanego z jego rodzica.

nidhi
źródło
0

android:gravityOkreśla właściwy (pozycja) z dziećmi, natomiast w android:layout_gravityustawia położenie samego widzenia. Mam nadzieję, że to pomoże

Joel
źródło