web-dev-qa-db-fra.com

Centrer verticalement une vue dans Android

J'essaie de centrer une View à la verticale sur l'écran avec la disposition suivante:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
    <EditText 
        Android:text="example text"  
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical" />
</LinearLayout>

Cependant cela ne fonctionne pas. La EditText est toujours en haut de l'écran. Quelqu'un peut-il expliquer ce que je fais mal ici?

NOTE: si j'ajoute center_horizontal à l'attribut layout_gravity, il le centre horizontalement, mais toujours pas verticalement.

UPDATE: en utilisant Android:gravity="center_vertical" sur le parent travaillé. Je ne comprends toujours pas pourquoi Android:layout_gravity="center_vertical" sur l'enfant n'a pas fonctionné.

34
Jeremy Logan

Je dépiste la réponse sur les groupes Google, la voici © Romain Guy:

Eh bien, tout d’abord, RelativeLayout ignore layout_gravity. Ensuite, vous devez savoir que gravité signifie "appliquer la gravité au contenu de cette vue", tandis que layout_gravity signifie "appliquer la gravité à cette vue dans son parent." Ainsi, sur un TextView, la gravité alignera le texte dans les limites de TextView alors que layout_gravity alignera le TextView dans les limites de son parent.

25
Bostone

La réponse simple et rapide consiste à ajouter Android:gravity="center_vertical" à la vue parent (contenant). Pour ceux qui veulent savoir pourquoi, référez-vous à la réponse de @Bostone.

0
didxga

Vous pouvez centrer une vue verticalement de trois manières. Je recommande d'utiliser le ConstraintLayout maintenant.

1. Horizontal LinearLayout

La clé est orientation = "horizontal". Vous ne pouvez pas centrer horizontalement pour orientation = "vertical".

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal">

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:text="example text"/>

</LinearLayout>

2. RelativeLayout

Avec RelativeLayout, vous pouvez utiliser layout_centerVertical="true".

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerVertical="true"
        Android:text="example text"/>

</RelativeLayout> 

3. ContrainteLayout

Il est plus facile de vous montrer celui-ci.

 enter image description here

Voici le XML. Il faudrait encore ajouter une contrainte horizontale.

<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.example.constraintlayout.MainActivity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginBottom="8dp"
        Android:layout_marginTop="8dp"
        Android:text="example text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="16dp"/>

</Android.support.constraint.ConstraintLayout>
0
Suragch