Qual è la differenza tra gravità e layout_gravity in Android?


1329

So che possiamo impostare i seguenti valori su android:gravitye android:layout_gravityproperties:

  1. center
  2. center_vertical
  3. center_horizontal, eccetera.

Ma sono confuso riguardo a entrambi.

Qual è la differenza tra l'uso di android:gravitye android:layout_gravity?


265
Facile trucco da ricordare: prendi "layout-gravity" come "Lay-outside-gravity"
Vishnu Haridas il

6
center == center_vertical | center_horizontal
Yousha Aleayoub

4
Questi video mi hanno aiutato molto a capire la differenza: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro

ImageViewsembra comportarsi diversamente da quello TextViewdi.
Samis,

Risposte:


1347

I loro nomi dovrebbero aiutarti:

  • android:gravityimposta la gravità dei contenuti (ovvero le sue sottoview) su Viewcui è utilizzato.
  • android:layout_gravityimposta la gravità del Viewo Layoutrelativa al suo genitore.

E un esempio è qui .


88
Fondamentalmente, tutto ciò che layout_definisce qualcosa che influenza gli elementi esterni.
Triang3l,

29
Vedi, lo trovo divertente, perché se esco dai nomi, la mia intuizione è il contrario. Ogni volta, penso che "layout_gravity" significhi "la gravità per come questo ViewGroup espone i suoi contenuti", e "gravità" è "dove gravita questa vista".
Ogre,

15
Quindi cosa succede se android:gravityè impostato a sinistra e i suoi figli android:layout_gravitysono impostati a destra? da che parte si allineeranno i bambini?
Giovedì

2
Come ha commentato @Suragch sulla sua risposta, layout_gravity funziona solo in LinearLayout e FrameLayout. LinearLayout ha comunque dei vincoli.
Marco Luglio,

1
@Thupten Ottima domanda. Immagino che prevarrà uno (credo che layout_gravity dei bambini) e l'altro sia solo il valore predefinito per quello prevalente.
Trilarion,

523

Dentro fuori

  • gravityorganizza il contenuto all'interno della vista.
  • layout_gravityorganizza la posizione della vista al di fuori di se stessa.

A volte aiuta anche a vedere un'immagine. Il verde e il blu sono TextViewse gli altri due colori di sfondo sono LinearLayouts.

inserisci qui la descrizione dell'immagine

Appunti

  • Il layout_gravitynon funziona per le viste in un RelativeLayout. Usalo per le viste in a LinearLayouto FrameLayout. Vedi la mia risposta supplementare per maggiori dettagli.
  • La larghezza (o altezza) della vista deve essere maggiore del suo contenuto. Altrimenti gravitynon avrà alcun effetto. Quindi, wrap_contente gravitysono insignificanti insieme.
  • La larghezza (o altezza) della vista deve essere inferiore a quella principale. Altrimenti layout_gravitynon avrà alcun effetto. Quindi, match_parente layout_gravitysono insignificanti insieme.
  • Lo layout_gravity=centersembra la stessa di layout_gravity=center_horizontalqui perché sono in un layout lineare verticale. In questo caso non puoi centrare verticalmente, quindi layout_gravity=centercentra solo orizzontalmente.
  • Questa risposta ha riguardato solo l'impostazione gravitye layout_gravityle viste all'interno di un layout. Per vedere cosa succede quando imposti il gravitysimbolo del layout genitore stesso, controlla la risposta supplementare che ho citato sopra. (Riepilogo: gravitynon funziona bene su a RelativeLayoutma può essere utile con a LinearLayout.)

Quindi ricorda, layout _gravity organizza una vista nel suo layout . Gravity organizza il contenuto all'interno della vista.

xml

Ecco il file XML per l'immagine sopra per il vostro riferimento:

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

Relazionato


sembra più facile dopo averlo visto visivamente, grazie Suragch.
Haritsinh Gohil,

467

La differenza

android:layout_gravityè la gravità esterna della vista. Specifica la direzione in cui la vista deve toccare il bordo del genitore.

android:gravityè la gravità interna di quella vista. Specifica in quale direzione il contenuto deve essere allineato.

Equivalenti HTML / CSS

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

Trucco semplice per aiutarti a ricordare

Prendi layout-gravitycome "Lay-outside-gravity".


ha più senso quando si ha un background di sviluppo web.
Haritsinh Gohil,

41

Risposta breve: utilizzare android:gravityo setGravity()per controllare la gravità di tutte le viste figlio di un contenitore; utilizzare android:layout_gravityo setLayoutParams()per controllare la gravità di una vista individuale in un contenitore.

Lunga storia: per controllare la gravità in un contenitore di layout lineare come LinearLayouto RadioGroup, ci sono due approcci:

1) Per controllare la gravità di TUTTE le viste figlio di un LinearLayoutcontenitore (come hai fatto nel tuo libro), usa android:gravity(non android:layout_gravity) nel file XML layout o il setGravity()metodo nel codice.

2) Per controllare la gravità di una vista figlio nel suo contenitore, utilizzare l' android:layout_gravityattributo XML. Nel codice, è necessario ottenere LinearLayout.LayoutParamsla vista e impostarne la gravità. Ecco un esempio di codice che imposta un pulsante in basso in un contenitore orientato orizzontalmente:

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

Per i LinearLayoutcontenitori orizzontali , la gravità orizzontale della vista figlio è allineata a sinistra una dopo l'altra e non può essere modificata. L'impostazione android:layout_gravitysu center_horizontalnon ha alcun effetto. La gravità verticale predefinita è center (o center_vertical) e può essere modificata in alto o in basso. In realtà il layout_gravityvalore predefinito è, -1ma Android lo mette al centro in verticale.

Per modificare le posizioni orizzontali delle viste figlio in un contenitore lineare orizzontale, è possibile utilizzare layout_weight, margine e riempimento della vista figlio.

Analogamente, per il contenitore Gruppo vista verticale, la gravità verticale della vista figlio è allineata in alto una sotto l'altra e non può essere modificata. La gravità orizzontale predefinita è centrale (o center_horizontal) e può essere cambiata a sinistra o a destra.

In realtà, una vista figlio come un pulsante ha anche l' android:gravityattributo XML e il setGravity()metodo per controllare le viste figlio - il testo in essa contenuto. Il Button.setGravity(int)è legata a questa voce di developer.android.com .


36

Da quello che posso raccogliere layout_gravity è la gravità di quella vista all'interno del suo genitore, e la gravità è la gravità dei bambini all'interno di quella vista.

Penso che sia giusto, ma il modo migliore per scoprirlo è giocare.



12

Se vogliamo impostare la gravità del contenuto all'interno di una vista, utilizzeremo "android: gravità", e se vogliamo impostare la gravità di questa vista (nel suo insieme) all'interno della sua vista padre, useremo "android: layout_gravity".


8

Ho solo pensato di aggiungere la mia spiegazione qui - proveniente da un background su iOS, è così che ho interiorizzato i due in termini iOS: "Layout Gravity" influenza la tua posizione nella superview. "Gravità" influisce sulla posizione delle tue sottoview all'interno di te. Detto in altro modo, Layout Gravity ti posiziona da solo mentre la gravità posiziona i tuoi figli.


7

Ci sono molte differenze nel gravitye layout-gravity. Spiegherò la mia esperienza su questi 2 concetti ( Tutte le informazioni che ho ottenuto grazie alla mia osservazione e ad alcuni siti Web ).

Uso di gravità e layout-gravità in FrameLayout.....

Nota:-

  1. La gravità viene utilizzata all'interno del contenuto di visualizzazione poiché alcuni utenti hanno una risposta ed è uguale per tutti ViewGroup Layout.

  2. Layout-gravity viene utilizzato con la vista padre poiché alcuni utenti hanno una risposta.

  3. Gravity and Layout-gravityè il lavoro più utile con i FrameLayoutbambini. We can't use Gravity and Layout-gravitynel tag FrameLayout ....

  4. Possiamo impostare Child View in qualsiasi punto FrameLayoutdell'utilizzo layout-gravity.

  5. Possiamo usare ogni singolo valore di gravità all'interno del FrameLayout (ad esempio: - center_vertical, center_horizontal, center, top, ecc), ma al momento non è possibile con altri layout ViewGroup.

  6. FrameLayoutcompletamente lavorando su Layout-gravity. Esempio: - Se si lavora su FrameLayoutallora non c'è bisogno di cambiare tutta layout per l'aggiunta di nuovo Panorama. Basta aggiungere Visualizza come ultimo nel FrameLayoute dargli Layout-gravityvalore ( questo è un vantaggio di gravità-layout con FrameLayout ).

guarda esempio ......

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

Produzione:-

g1

Uso di gravità e gravità-layout in LinearLayout .....

Gravityfunziona come sopra ma qui la differenza è che possiamo usare Gravity all'interno di LinearLayout Viewe in RelativeLayout Viewcui non è possibile FrameLayout View.

Disposizione lineare con orientamento verticale ....

Nota: - Qui possiamo impostare solo 3 valori di layout_gravityquesto è ( left| right| center(chiamato anche center_horizontal)).

guarda esempio: -

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

Produzione:-

g2

Layout lineare con orientamento orizzontale ....

Nota: - Qui possiamo impostare anche 3 valori di layout_gravityquesto è ( top| bottom| center(chiamato anche center_vertical)).

guarda esempio: -

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

produzione:-

g3

Nota: - Non possiamo usare layout_gravityin RelativeLayout Viewsma possiamo usare gravityper impostare i RelativeLayoutbambini nella stessa posizione ....


1
Se imposti il textColorbianco in tutto view, sarebbe fantastico. : D
Pratik Butani,

Sei sicuro? Sembrerà bianco e nero, ecco perché ho usato colori diversi per ogni vista.
sushildlh,

6

Un trucco semplice da ricordare è che la gravità si applica a noi all'interno della terra. Quindi, android:gravityè per dentro la vista.

Rememeber l' out in lay out _gravity che li aiuterebbe a ricordare che android:layout_gravitysarebbe fare riferimento al di fuori della vista


5

Qualcosa che ho visto sul blog di Sandip che quasi mi mancava, risolveva il mio problema. Ha detto che layout_gravityNON FUNZIONA LinearLayout.

Se stai usando LinearLayoutae le impostazioni di gravità ti stanno facendo impazzire (come me), passa a qualcos'altro.

In realtà sono passato a un RelativeLayoutusato layout_alignParentLefte layout_alignParentRightsul 2 contenuto TextViews per farli su una riga per andare all'estrema sinistra e all'estrema destra.


4

La differenza fondamentale tra i due è che-

androide: la gravità viene utilizzata per gli elementi figlio della vista.

android: layout_gravity viene utilizzato per questo elemento rispetto alla vista principale.


3

android:gravityviene utilizzato per specificare come posizionare il contenuto dell'oggetto all'interno dell'oggetto stesso. In altre parole, android: la gravità viene utilizzata per specificare la gravità del contenuto della vista.

android:layout_gravity è un'attribuzione che il bambino può fornire al genitore, per specificare la gravità della vista all'interno dei suoi genitori.

Per maggiori dettagli puoi visitare

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


2
Penso che non sia necessaria una nuova risposta in quanto ci sono già più risposte e con quasi gli stessi contenuti coperti!
Paresh Mayani,

3

Gravità: consente di spostare il contenuto all'interno di un contenitore. (Come verranno posizionate le viste secondarie).

Importante: (SPOSTA lungo l'asse X o l'asse Y nello spazio disponibile).

Esempio: supponiamo che se dovessi lavorare con LinearLayout (Height: match_parent, Width: match_parent) come elemento di livello radice, avrai a disposizione uno spazio completo per i frame; e le viste figlio indicano 2 TextViews (Altezza: wrap_content, Larghezza: wrap_content) all'interno di LinearLayout può essere spostato lungo l'asse x / y usando i valori corrispondenti per gravità sul genitore.

Layout_Gravity: consente di ignorare il comportamento della gravità del genitore SOLO lungo l'asse x.

Importante: (SPOSTA [override] lungo l'asse X nello spazio disponibile).

Esempio: se si tiene presente l'esempio precedente, sappiamo che la gravità ci ha consentito di spostarci lungo l'asse x / y, ovvero; il posto TextViews all'interno di LinearLayout. Diciamo solo che LinearLayout specifica la gravità: centro; ciò significa che ogni TextView deve essere centrato sia in verticale che in orizzontale. Ora, se vogliamo che uno dei TextView vada a sinistra / a destra, possiamo sovrascrivere il comportamento a gravità specificato usando layout_gravity su TextView.

Bonus: se approfondisci, scoprirai che il testo all'interno di TextView funge da sotto-visualizzazione; quindi se si applica la gravità su TextView, il testo all'interno di TextView si sposterà. (l'intero concetto si applica anche qui)


1

La gravità viene utilizzata per impostare l'allineamento del testo nelle viste, ma layout_gravity viene utilizzato per impostare le viste da solo. Facciamo un esempio se si desidera allineare il testo scritto in editText, quindi utilizzare la gravità e si desidera allineare questo editText o qualsiasi pulsante o vista, quindi utilizzare layout_gravity, quindi è molto semplice.


1

gravità : viene utilizzato per visualizzazioni semplici come textview, edittext ecc.

layout_gravity : viene utilizzato per la vista corrente solo per gravità nel contesto della vista padre relativa come Layout lineare o FrameLayout per rendere la vista al centro o qualsiasi altra gravità del padre.


layout_gravity: viene utilizzato per la vista corrente solo per gravità nel contesto del relativo genitore relativo, non di altre viste all'interno del suo genitore.
Chintak Patel,

0
android:gravity

viene utilizzato per regolare il contenuto della vista in relazione alla sua posizione specifica (area allocata). android:gravity="left" non farebbe nulla se layout_widthè uguale a"wrap_content"

android:layout_gravity 

viene utilizzato per la visualizzazione stessa relativa al file principale o di layout.


0

android:gravity -> Imposta la gravità del contenuto della vista su cui è utilizzato.

android:layout_gravity -> Imposta la gravità della vista o del layout del genitore


0

gravità: si applica alla propria visione.

layout-gravità --- Si applica alla visualizzazione relativa al suo genitore.


0

L' android:gravityimposta la gravità (posizione) dei bambini mentre gli android:layout_gravityinsiemi la posizione della vista stessa. Spero che sia d'aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.