Différence entre la gravité et la mise en page de la gravité sur Android
je sais que nous pouvons définir les valeurs suivantes aux propriétés android:gravity
et android:layout_gravity
:
-
center
-
center_vertical
-
center_horizontal
, etc.
mais je suis confus à propos de ces deux.
Quelle est la différence entre l'usage de android:gravity
et android:layout_gravity
?
19 réponses
la différence
android:layout_gravity
est le extérieur gravité de la vue. Spécifie la direction dans laquelle la vue doit toucher la bordure de sa mère.
android:gravity
est le à l'intérieur de gravité de cette vue. Spécifie dans quelle direction son contenu doit s'aligner.
HTML / CSS Equivalents
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
astuce facile pour vous aider à vous souvenir
Prendre layout-gravity
"Laïcs-à l'extérieur-de la gravité".
-
gravity
organise le contenu à l'intérieur la vue. -
layout_gravity
organise la position de la vue en dehors de de lui-même.
parfois, il est utile de voir une image, aussi. Le vert et le bleu sont TextViews
et les deux autres couleurs de fond sont LinearLayouts
.
Notes
- le
layout_gravity
ne fonctionne pas pour les vues dans unRelativeLayout
. L'utiliser pour les vues dans unLinearLayout
ouFrameLayout
. Voir ma réponse supplémentaire pour plus de détails. - la largeur (ou hauteur) de la vue doit être supérieure à son contenu. Sinon
gravity
n'aura pas effet. Ainsi,wrap_content
etgravity
n'ont pas de sens ensemble. - la largeur (ou la hauteur) de la vue doit être inférieure à celle du parent. Sinon
layout_gravity
n'aura aucun effet. Ainsi,match_parent
etlayout_gravity
n'ont pas de sens ensemble. - le
layout_gravity=center
ressemble àlayout_gravity=center_horizontal
ici parce qu'ils sont dans un plan linéaire vertical. Vous ne pouvez pas centrer verticalement dans ce cas, donclayout_gravity=center
ne se centre que horizontalement. - cette réponse ne portait que sur le réglage de
gravity
etlayout_gravity
sur les vues à l'intérieur d'une mise en page. Pour voir ce qui se passe lorsque vous définissez legravity
de la mise en page du parent lui-même, consultez la réponse supplémentaire que j'ai mentionnée ci-dessus. (Résumé:gravity
ne fonctionne pas bien sur unRelativeLayout
, mais peut être utile avec unLinearLayout
.)
Donc n'oubliez pas, mise en page _gravity organise une vue dans son layout . La gravité organise le contenu à l'intérieur de la vue.
xml
Voici le xml pour 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>
lié
brève réponse: utiliser android:gravity
ou setGravity()
pour contrôler la gravité de toutes les vues d'enfant d'un conteneur; utiliser android:layout_gravity
ou setLayoutParams()
pour contrôler la gravité d'une vue individuelle dans un conteneur.
longue histoire: pour contrôler la gravité dans un conteneur linéaire tel que LinearLayout
ou RadioGroup
, il y a deux approches:
1) pour contrôler la gravité de toutes les vues d'enfant d'un LinearLayout
conteneur (comme vous l'avez fait dans votre livre), utilisez android:gravity
(pas android:layout_gravity
) dans le fichier de configuration XML ou setGravity()
méthode dans le code.
2) pour contrôler la gravité de la vue d'un enfant dans son contenant, utilisez l'attribut android:layout_gravity
XML. En code, on doit obtenir le LinearLayout.LayoutParams
de la vue et régler sa gravité. Voici un exemple de code qui définit un bouton vers le 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 conteneur horizontal LinearLayout
, la pesanteur horizontale de son enfant la vue est alignée à gauche l'une après l'autre et ne peut pas être changée. Fixer android:layout_gravity
à center_horizontal
n'a aucun effet. La gravité verticale par défaut est centrale (ou center_vertical) et peut être changée en haut ou en bas. En fait, la valeur par défaut layout_gravity
est -1
mais Android l'a mis centre verticalement.
pour changer les positions horizontales des vues de l'enfant dans un conteneur linéaire horizontal, on peut utiliser layout_weight
, marge et rembourrage de la vue de l'enfant.
de la même manière, pour le conteneur du groupe de vision verticale, la gravité verticale de son champ de vision pour enfants est alignée sur le haut l'une par-dessous l'autre et ne peut pas être changée. La gravité horizontale par défaut est au centre (ou center_horizontal
) et peut être changée à gauche ou à droite.
en fait, une vue enfant telle qu'un bouton a aussi l'attribut android:gravity
XML et la méthode setGravity()
pour contrôler ses vues enfant -- le texte en elle. Le Button.setGravity(int)
est lié à ce developer.android.com entrée .
de ce que je peux en déduire layout_gravity est la gravité de cette vue à l'intérieur de son parent, et gravité est la gravité des enfants à l'intérieur de cette vue.
je pense que c'est juste, mais la meilleure façon de le savoir est de jouer.
bien que la question soit déjà répondue j'ai quelques exemples démontrant l'utilisation de la gravité, layout_gravity, et layout_weight.
vous pouvez trouver les exemples à http://juanpickselov.com/LayoutExamples.zip
j'ai créé les fichiers dans Eclipse, supprimé le .svn sous-dossiers et ont inclus des styles, des cordes, des couleurs, etc. Les fichiers de mise en page sont le point principal des démos. Depuis que je suis un développement Java et Android Novice, on peut trouver le Java inefficace. Les fichiers peuvent être copiés dans un projet Eclipse ou je les ai également utilisés dans Netbeans avec le plugin de développement Android disponible pour cet IDE.
si nous voulons définir la gravité du contenu dans une vue, alors nous utiliserons" android:gravité", et si nous voulons définir la gravité de cette vue (dans son ensemble) dans sa vue mère, alors nous utiliserons"android:layout_gravity".
juste pensé que je voudrais ajouter ma propre explication ici - venant d'un fond sur iOS, c'est comment j'ai intériorisé les deux en termes iOS:" Layout Gravity " affecte votre position dans la superview. La "gravité" affecte la position de vos subviews en vous. Autrement dit, la pesanteur vous positionne vous-même tandis que la pesanteur positionne vos enfants.
il y a beaucoup de différence entre le gravity
et le layout-gravity
. Je vais vous expliquer mon expérience sur ces 2 concepts ( toutes les informations que j'ai obtenues grâce à mon observation et certains sites ).
Utilisation De la Gravité et de la Mise en page de la gravité dans
FrameLayout
.....
Remarque:-
-
gravité est utilisé à l'intérieur du voir le contenu comme un certain Utilisateur ont réponse et il est le même pour tous
ViewGroup Layout
. -
Layout-gravity
est utilisé avec la vue de parent comme un utilisateur ont réponse. -
Gravity and Layout-gravity
est travailler plus utile avec laFrameLayout
childs .We can't use Gravity and Layout-gravity
dans le Tag de FrameLayout .... -
nous pouvons définir Child View n'importe où dans le
FrameLayout
en utilisantlayout-gravity
. -
nous pouvons utiliser chaque valeur unique de gravité à l'intérieur du FrameLayout (eg:-
center_vertical
,center_horizontal
,center
,top
, etc), mais ce n'est pas possible avec d'autres configurations de groupes de vue . -
FrameLayout
Exemple:- Si vous travaillez surFrameLayout
, alors vous pas besoin de changer la mise en page entière pour ajouter une nouvelle vue. Vous juste ajouter vue comme dernier dans leFrameLayout
et lui donnerLayout-gravity
avec valeur.( c'est un avantage de la disposition-gravité avec FrameLayout ).
coup d'oeil sur 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>
sortie: -
Utilisation De la Gravité et de la Mise en page de la gravité dans LinearLayout .....
Gravity
même travail que ci-dessus, mais ici la différence est que nous pouvons utiliser la gravité à l'intérieur du LinearLayout View
et RelativeLayout View
qui n'est pas possible dans FrameLayout View
.
parcours linéaire avec orientation verticale ....
Note: - ici, nous pouvons définir seulement 3 valeurs de layout_gravity
qui est ( left
| right
| center
(aussi appelé center_horizontal
)).
coup d'oeil sur 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>
sortie: -
parcours linéaire avec orientation horizontale ....
Note: - ici, nous pouvons définir aussi 3 valeurs de layout_gravity
qui est ( top
| bottom
| center
(aussi appelé center_vertical
)).
coup d'oeil sur 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>
sortie: -
Remarque:- Nous on ne peut pas utiliser layout_gravity
dans le RelativeLayout Views
mais on peut utiliser gravity
pour mettre RelativeLayout
childs à la même position....
quelque chose que J'ai vu sur le blog de Sandip que j'ai presque manqué, a réglé mon problème. Il a dit layout_gravity
ne fonctionne pas avec LinearLayout
.
si vous utilisez un LinearLayout
et que les réglages de gravité vous rendent dingue (comme moi), alors passez à autre chose.
je suis en fait passé à un RelativeLayout
puis utilisé layout_alignParentLeft
et layout_alignParentRight
sur les 2 contenus TextView
pour les obtenir sur une ligne pour aller loin à gauche et loin à droite.
un truc facile à retenir est que la pesanteur s'applique à nous à l'intérieur de la terre. Donc, android:gravity
est pour à l'intérieur de la vue.
Rememeber la out dans laïcs out _gravity , qui devrait vous aider à vous rappeler que android:layout_gravity
se réfère aux à l'extérieur la vue
android:gravity
est 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 à son parent, pour préciser 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
La différence fondamentale entre les deux est que-
android:gravity est utilisé pour les éléments enfants de la vue.
android:layout_gravity est utilisé pour cet élément à l'égard de la vue parente.
Gravity: permet de déplacer le contenu à l'intérieur d'un conteneur. (Comment les sous-vues seront placés).
Important: (se déplacer le long de l'axe des X ou de l'axe des Y dans l'espace disponible).
exemple: disons que si vous deviez travailler avec LinearLayout (Height: match_parent, Width: match_parent) comme élément de niveau root, alors vous aurez un espace plein cadre disponible; et le point de vue de l'enfant dit 2 TextViews (Height: wrap_content, Width: wrap_content) à l'intérieur de la LinearLayout peut être déplacé le long de l'axe x/y en utilisant les valeurs correspondantes pour la gravité sur parent.
Layout_Gravity: vous permet de surcharger le comportement de gravité parent seulement le long de l'axe des X.
Important: (déplacer[Outrepasser] le long de l'axe des X dans l'espace disponible).
exemple: dans l'exemple précédent, nous savons que la gravité nous a permis de nous déplacer le long de l'axe x/Y. e; la place TextViews inside LinearLayout. Disons simplement que LinearLayout spécifie gravity: center; ce qui signifie que chaque TextView doit être centré à la fois verticalement et horizontalement. Maintenant, si nous voulons que L'une des versions de TextView tourne à gauche / droite, nous pouvons Outrepasser le comportement de gravité spécifié en utilisant layout_gravity sur TextView.
Bonus: si vous creusez plus profond, vous trouverez que le texte dans TextView agit comme une sous-vue; donc si vous appliquez la gravité sur TextView, le texte à l'intérieur de TextView se déplacera. (toute la notion s'applique ici aussi)
Gravity est utilisé pour définir l'alignement du texte dans les vues, mais layout_gravity est utilisé pour définir les vues elles-mêmes. Prenons un exemple si vous voulez aligner du texte écrit dans editText puis utilisez gravity et vous voulez aligner ce texte édité ou n'importe quel bouton ou n'importe quelle vue puis utilisez layout_gravity, donc c'est très simple.
gravity : est utilisé pour des vues simples comme textview, edittext etc.
layout_gravity : est utilisé pour la vue courante seulement la gravité dans le contexte de sa vue parent relative comme la disposition linéaire ou FrameLayout pour faire la vue au centre ou toute autre gravité de son parent.
android:gravity
est utilisé pour ajuster le contenu de la vue par rapport à sa position spécifique (zone allouée). android:gravity="left"
ne ferait rien si layout_width
est égal à "wrap_content"
android:layout_gravity
est utilisé pour la vue elle-même par rapport au fichier parent ou layout.
android:gravity
-> Définit la gravité du contenu de la Vue de son.
android:layout_gravity
- > définit la gravité de la vue ou de la disposition de ses parents