Quelle est la différence entre gravité et layout_gravity dans Android?

1330

Je sais que nous pouvons définir les valeurs suivantes pour les propriétés android:gravityet android:layout_gravity:

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

Mais je suis confus en ce qui concerne les deux.

Quelle est la différence entre l'utilisation de android:gravityet android:layout_gravity?

Paresh Mayani
la source
265
Astuce facile à retenir: Prenez "disposition-gravité" comme "Lay-outside-gravité"
Vishnu Haridas
6
center == center_vertical | center_horizontal
Yousha Aleayoub
4
Ces vidéos m'ont beaucoup aidé à comprendre la différence: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro
ImageViewsemblent se comporter différemment TextViewdes.
samis

Réponses:

1348

Leurs noms devraient vous aider:

  • android:gravitydéfinit la gravité du contenu (c'est-à-dire ses sous-vues) du contenu Viewutilisé.
  • android:layout_gravitydéfinit la gravité de Viewou par Layoutrapport à son parent.

Et un exemple est ici .

Sephy
la source
88
Fondamentalement, tout ce qui layout_définit quelque chose qui affecte les éléments extérieurs.
Triang3l
29
Vous voyez, je trouve ça drôle, parce que si je supprime simplement les noms, mon intuition est l'inverse. Chaque fois, je pense que "layout_gravity" signifie "la gravité de la façon dont ce ViewGroup présente son contenu", et "gravity" est "où cette vue gravite".
Ogre
15
Alors, que se passe-t-il si le android:gravityest réglé à gauche et ses enfants android:layout_gravityà droite? de quel côté les enfants s'aligneront-ils?
Thupten
2
Comme @Suragch a commenté sa réponse, layout_gravity ne fonctionne que dans LinearLayout et FrameLayout. LinearLayout a cependant des contraintes.
Marco Luglio
1
@Thupten Très bonne question. Je suppose que l'un prévaudra (je suppose que la disposition des enfants_la gravité) et l'autre n'est que la valeur par défaut pour celui qui prévaut.
Trilarion
523

Dedans dehors

  • gravityorganise le contenu à l' intérieur de la vue.
  • layout_gravityarrange la position de la vue en dehors de lui-même.

Parfois, il est également utile de voir une image. Le vert et le bleu sont TextViewset les deux autres couleurs de fond sont LinearLayouts.

entrez la description de l'image ici

Remarques

  • Le layout_gravityne fonctionne pas pour les vues dans a RelativeLayout. Utilisez-le pour les vues dans un LinearLayoutou FrameLayout. Voir ma réponse supplémentaire pour plus de détails.
  • La largeur (ou la hauteur) de la vue doit être supérieure à son contenu. Sinon, cela gravityn'aura aucun effet. Ainsi, wrap_contentet gravityn'ont aucun sens ensemble.
  • La largeur (ou la hauteur) de la vue doit être inférieure à celle du parent. Sinon, cela layout_gravityn'aura aucun effet. Ainsi, match_parentet layout_gravityn'ont aucun sens ensemble.
  • L' layout_gravity=centeraspect est le même layout_gravity=center_horizontalqu'ici car ils sont dans une disposition linéaire verticale. Vous ne pouvez pas centrer verticalement dans ce cas, donc layout_gravity=centeruniquement centré horizontalement.
  • Cette réponse concernait uniquement la définition gravityet layout_gravityles vues dans une mise en page. Pour voir ce qui se passe lorsque vous définissez le gravityde la disposition parent elle-même, consultez la réponse supplémentaire à laquelle j'ai fait référence ci-dessus. (Résumé: gravityne fonctionne pas bien sur un RelativeLayoutmais peut être utile avec un LinearLayout.)

N'oubliez donc pas que la disposition _gravity organise une vue dans sa disposition . La gravité organise le contenu à l'intérieur de la vue.

xml

Voici le xml de l'image ci-dessus pour votre référence:

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

en relation

Suragch
la source
cela semble plus facile après l'avoir vu visuellement, merci Suragch.
Haritsinh Gohil
467

La différence

android:layout_gravityest la gravité extérieure de la vue. Spécifie la direction dans laquelle la vue doit toucher la bordure de son parent.

android:gravityest la gravité intérieure de cette vue. Spécifie dans quelle direction son contenu doit s'aligner.

Équivalents HTML / CSS

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

Astuce facile pour vous aider à vous souvenir

Prenez layout-gravitycomme "Lay-outside-gravity".

Vishnu Haridas
la source
cela a plus de sens lorsque vous avez de l'expérience en développement Web.
Haritsinh Gohil
41

Réponse courte: utilisez android:gravityou setGravity()pour contrôler la gravité de toutes les vues enfant d'un conteneur; utiliser android:layout_gravityou setLayoutParams()pour contrôler la gravité d'une vue individuelle dans un conteneur.

Longue histoire: pour contrôler la gravité dans un conteneur de disposition linéaire tel que LinearLayoutor RadioGroup, il existe deux approches:

1) Pour contrôler la gravité de TOUTES les vues enfant d'un LinearLayoutconteneur (comme vous l'avez fait dans votre livre), utilisez android:gravity(pas android:layout_gravity) dans le fichier XML de mise en page ou la setGravity()méthode dans le code.

2) Pour contrôler la gravité d'une vue enfant dans son conteneur, utilisez l' android:layout_gravityattribut XML. En code, il faut obtenir LinearLayout.LayoutParamsla vue et régler sa gravité. Voici un exemple de code qui définit un bouton en bas dans un conteneur orienté horizontalement:

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

Pour le LinearLayoutconteneur horizontal , la gravité horizontale de sa vue enfant est alignée à gauche l'une après l'autre et ne peut pas être modifiée. La définition android:layout_gravityde center_horizontaln'a aucun effet. La gravité verticale par défaut est center (ou center_vertical) et peut être changée en haut ou en bas. En fait, la layout_gravityvaleur par défaut est -1mais Android l'a placé verticalement.

Pour modifier les positions horizontales des vues enfant dans un conteneur linéaire horizontal, on peut utiliser la layout_weightmarge et le remplissage de la vue enfant.

De même, pour le conteneur de groupe de vues vertical, la gravité verticale de sa vue enfant est alignée en haut l'une au-dessous de l'autre et ne peut pas être modifiée. La gravité horizontale par défaut est le centre (ou center_horizontal) et peut être modifiée à gauche ou à droite.

En fait, une vue enfant telle qu'un bouton a également android:gravityun attribut XML et la setGravity()méthode pour contrôler ses vues enfant - le texte qu'il contient . Le Button.setGravity(int)est lié à cette entrée developer.android.com .

Ying
la source
36

D'après ce que je peux rassembler layout_gravity est la gravité de cette vue à l'intérieur de son parent, et la gravité est la gravité des enfants à l'intérieur de cette vue.

Je pense que c'est vrai, mais la meilleure façon de le savoir est de jouer.

matto1990
la source
29

Regardez l'image pour être clair sur la gravité

Akshay Paliwal
la source
12

Si nous voulons définir la gravité du contenu dans une vue, nous utiliserons "android: gravité", et si nous voulons définir la gravité de cette vue (dans son ensemble) dans sa vue parente, nous utiliserons "android: layout_gravity ".

Abhishek Tamta
la source
8

Je pensais simplement ajouter ma propre explication ici - venant d'un arrière-plan sur iOS, voici comment j'ai internalisé les deux en termes iOS: "Layout Gravity" affecte votre position dans la vue d'ensemble. "Gravity" affecte la position de vos sous-vues en vous. Autrement dit, Layout Gravity vous positionne vous-même tandis que la gravité positionne vos enfants.

mszaro
la source
7

Il y a beaucoup de différence entre le gravityet layout-gravity. Je vais vous expliquer mon expérience sur ces 2 concepts ( toutes les informations que j'ai obtenues à cause de mon observation et de quelques sites web ).

Utilisation de la gravité et de la disposition-gravité dans FrameLayout.....

Remarque:-

  1. La gravité est utilisée dans le contenu de la vue car certains utilisateurs ont répondu et c'est la même chose pour tous ViewGroup Layout.

  2. Layout-gravity est utilisé avec la vue parent comme certains utilisateurs ont répondu.

  3. Gravity and Layout-gravityce travail est plus utile avec les FrameLayoutenfants. We can't use Gravity and Layout-gravitydans le Tag de FrameLayout ....

  4. Nous pouvons définir Child View n'importe où dans l' FrameLayoututilisation layout-gravity.

  5. Nous pouvons utiliser chaque valeur unique de gravité à l' intérieur du FrameLayout (par exemple: - center_vertical, center_horizontal, center, top, etc.), mais il est impossible avec d' autres ViewGroup Layouts.

  6. FrameLayouttravailler pleinement Layout-gravity. Exemple: - Si vous travaillez, FrameLayoutvous n'avez pas besoin de modifier la disposition entière pour ajouter une nouvelle vue. Vous ajoutez simplement View comme dernier dans le FrameLayoutet lui donnez Layout-gravityde la valeur ( ce sont les avantages de la mise en page-gravité avec FrameLayout ).

regardez l'exemple ......

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

Production:-

g1

Utilisation de la gravité et de la disposition-gravité dans LinearLayout .....

Gravityfonctionnant comme ci-dessus, mais ici la différence est que nous pouvons utiliser la gravité à l'intérieur du LinearLayout Viewet RelativeLayout Viewce qui n'est pas possible dans FrameLayout View.

Disposition linéaire avec orientation verticale ....

Remarque: - Ici, nous ne pouvons définir que 3 valeurs de ce layout_gravityqui est ( left| right| center(également appelé center_horizontal)).

regardez par exemple: -

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

Production:-

g2

Disposition linéaire avec orientation horizontale ....

Remarque: - Ici, nous pouvons également définir 3 valeurs, layout_gravityc'est-à-dire ( top| bottom| center(également appelé center_vertical)).

regardez par exemple: -

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

production:-

g3

Remarque: - Nous ne pouvons pas utiliser layout_gravitydans le RelativeLayout Viewsmais nous pouvons utiliser gravitypour définir les RelativeLayoutenfants à la même position ....

sushildlh
la source
1
Si vous définissez du textColorblanc, viewce serait très bien. : D
Pratik Butani
Êtes-vous sûr? Il sera noir et blanc, c'est pourquoi j'ai utilisé des couleurs différentes pour chaque vue.
sushildlh
6

Une astuce facile à retenir est que la gravité s'applique à nous à l'intérieur de la Terre. Donc, android:gravityc'est pour l' intérieur de la vue.

Rememeber le sortir en lay out _gravity qui vous aidera à vous rappeler que android:layout_gravitycela se référer à l' extérieur de la vue

Mahendra Liya
la source
5

Quelque chose que j'ai vu sur le blog de Sandip que j'ai presque manqué, a résolu mon problème. Il a dit layout_gravityNE FONCTIONNE PAS AVEC LinearLayout.

Si vous utilisez un LinearLayoutet que les paramètres de gravité vous rendent fou (comme moi), passez à autre chose.

En fait, je suis passé à un RelativeLayoutalors utilisé layout_alignParentLeftet layout_alignParentRightsur les 2 contenus TextViewpour les mettre sur une seule ligne pour aller à l'extrême gauche et à l'extrême droite.

JustSomeGuy
la source
4

La différence fondamentale entre les deux est que-

android: la gravité est utilisée pour les éléments enfants de la vue.

android: layout_gravity est utilisé pour cet élément par rapport à la vue parent.

Abhishek T.
la source
3

android:gravityest utilisé pour spécifier comment placer le contenu de l'objet dans l'objet lui-même. Dans un autre mot, android: gravity est utilisé pour spécifier la gravité du contenu de la vue.

android:layout_gravity est une attribution que l'enfant peut fournir à ses parents, pour spécifier la gravité de la vue au sein de ses parents.

Pour plus de détails, vous pouvez visiter

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

IntelliJ Amiya
la source
2
Je pense que pas besoin de nouvelle réponse car il y a plusieurs réponses déjà publiées et avec presque le même contenu couvert!
Paresh Mayani
3

Gravité: permet de déplacer le contenu à l'intérieur d'un conteneur. (Comment les sous-vues seront placées).

Important: (DÉPLACER le long de l'axe X ou de l'axe Y dans l'espace disponible).

Exemple: Disons que si vous deviez travailler avec LinearLayout (Hauteur: match_parent, Largeur: match_parent) comme élément de niveau racine, alors vous aurez un espace plein cadre disponible; et les vues enfant indiquent que 2 TextViews (Hauteur: wrap_content, Largeur: wrap_content) à l'intérieur du LinearLayout peuvent être déplacées le long de l'axe x / y en utilisant les valeurs correspondantes de gravité sur le parent.

Layout_Gravity: permet de remplacer le comportement de gravité parent UNIQUEMENT le long de l'axe des x.

Important: (DÉPLACER [remplacer] le long de l'axe X dans l'espace disponible).

Exemple: Si vous gardez à l'esprit l'exemple précédent, nous savons que la gravité nous a permis de nous déplacer le long de l'axe x / y, c'est-à-dire; placez TextViews dans LinearLayout. Disons simplement que LinearLayout spécifie la gravité: centre; ce qui signifie que chaque TextView doit être centrée verticalement et horizontalement. Maintenant, si nous voulons que l'un des TextView aille à gauche / à droite, nous pouvons remplacer le comportement de gravité spécifié en utilisant layout_gravity sur le TextView.

Bonus: si vous creusez plus profondément, vous découvrirez que le texte dans TextView agit comme sous-vue; donc si vous appliquez la gravité sur TextView, le texte à l'intérieur de TextView se déplacera. (le concept entier s'applique ici aussi)

Ali Raza
la source
1

La gravité est utilisée pour définir l'alignement du texte dans les vues, mais layout_gravity est utilisé pour définir les vues lui-même. Prenons un exemple si vous voulez aligner du texte écrit dans editText puis utiliser la gravité et vous voulez aligner ce editText ou n'importe quel bouton ou n'importe quelle vue puis utiliser layout_gravity, donc c'est très simple.

Praveen Gaur
la source
1

gravité : est utilisé pour des vues simples comme textview, edittext etc.

layout_gravity : est utilisé pour la gravité actuelle de la vue uniquement dans le contexte de sa vue parent relative comme Layout linéaire ou FrameLayout pour faire une vue au centre ou toute autre gravité de son parent.

Mayank Garg
la source
layout_gravity: est utilisé pour la gravité actuelle de la vue uniquement dans le contexte de son parent relatif, pas pour les autres vues situées à l'intérieur de son parent.
Chintak Patel
0
android:gravity

est utilisé pour ajuster le contenu de la vue par rapport à sa position spécifiée (zone allouée). android:gravity="left" ne ferait rien si layout_widthest égal à la"wrap_content"

android:layout_gravity 

est utilisé pour la vue elle-même par rapport au fichier parent ou de mise en page.

Tulsi
la source
0

android:gravity -> Définit la gravité du contenu de la vue utilisée.

android:layout_gravity -> Définit la gravité de la vue ou de la disposition du parent

Vamsi
la source
0

gravité - S'applique à sa propre vision.

layout-gravity --- S'applique à la vue liée à son parent.

nidhi
la source
0

Le android:gravitydéfinit la gravité (position) des enfants tandis que le android:layout_gravitydéfinit la position de la vue elle-même. J'espère que cela aide

Joel
la source