167 votes

Alignement des vues de texte sur les bords gauche et droit dans la mise en page Android

Je commence à utiliser Android. J'ai du mal à créer une mise en page simple.

Je voudrais utiliser un LinearLayout à la position deux TextViews en une seule rangée. Un seul TextView sur le côté gauche, l'autre sur le côté droit (analogue à float:left, float:right en CSS).

Est-ce possible, ou dois-je utiliser une méthode différente ViewGroup ou une imbrication plus poussée des mises en page pour y parvenir ?

Voici ce que j'ai pour l'instant :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="horizontal" android:padding="10sp">
<TextView android:id="@+id/mytextview1" android:layout_height="wrap_content" android:text="somestringontheleftSomestring" android:layout_width="wrap_content"/>
<TextView android:id="@+id/mytextview2" android:layout_height="wrap_content" android:ellipsize="end"
    android:text="somestringontheright" android:layout_width="wrap_content"/>
</LinearLayout>

302voto

Dave Webb Points 90034

Utilisez un RelativeLayout con layout_alignParentLeft y layout_alignParentRight :

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:padding="10dp">

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" 
        android:id="@+id/mytextview1"/>

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentRight="true" 
        android:id="@+id/mytextview2"/>

</RelativeLayout>

Aussi, vous devriez probablement utiliser dip (ou dp ) plutôt que sp dans votre mise en page . sp reflètent les paramètres du texte ainsi que la densité de l'écran, de sorte qu'ils ne servent généralement qu'à dimensionner les éléments de texte.

60 votes

Pour éviter que le contenu ne se chevauche, vous pouvez également ajouter "Android:layout_toLeftOf="@+id/mytextview2"" à la première fenêtre de texte.

0 votes

Pour les tableaux dynamiques, vous pouvez faire ce qui suit : TableRow.LayoutParams col1Params = new TableRow.LayoutParams() ; // Encapsuler le contenu de la ligne col1Params.height = LayoutParams.WRAP_CONTENT ; col1Params.width = LayoutParams.WRAP_CONTENT ; // Définir la gravité pour centrer la gravité de la colonne col1Params.gravity = Gravity.LEFT ;

4 votes

Pour une meilleure compatibilité et la prise en charge de différents écrans de périphériques, utilisez "Android:layout_alignParentEnd="true"". (lorsque vous utilisez layout_alignParentRight) et "Android:layout_alignParentStart="true"". (lorsque vous utilisez l'option layout_alignParentLeft).

90voto

jeremynealbrown Points 7588

Vous pouvez utiliser la propriété de gravité pour faire "flotter" les vues.

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

    <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal">

        <TextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:gravity="left"
            android:layout_weight="1"
            android:text="Left Aligned"
            />

        <TextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:gravity="right"
            android:layout_weight="1"
            android:text="Right Aligned"
            />
    </LinearLayout>

</LinearLayout>

1 votes

Malheureusement, il semble que cela ne permette pas aux deux éléments d'être sur la même ligne.

1 votes

La gravité n'affecte-t-elle pas uniquement l'"alignement du texte" ?

4 votes

Désolé, ça marche. J'avais oublié d'ajouter Android:layout_weight="1". Après l'avoir ajouté, tout va bien.

18voto

Carson Holzheimer Points 518

Cela peut être fait avec LinearLayout (moins de frais généraux et plus de contrôle que l'option de mise en page relative). Donnez à la deuxième vue l'espace restant, de sorte que gravity peut fonctionner. Testé jusqu'à l'API 16.

Proof

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Aligned left" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:text="Aligned right" />
</LinearLayout> 

Si vous souhaitez limiter la taille de la première vue de texte, procédez comme suit :

Ajustez les poids selon les besoins. La mise en page relative ne vous permet pas de définir un pourcentage de poids comme celui-ci, mais seulement un dp fixe d'une des vues.

Proof 2

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Aligned left but too long and would squash the other view" />

    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:text="Aligned right" />
</LinearLayout>

9voto

pumpkinpie65 Points 11

Même avec le conseil de Rollin_s, la réponse de Dave Webb n'a pas fonctionné pour moi. Le texte dans la partie droite TextView chevauchait toujours le texte dans la partie gauche TextView .

J'ai fini par obtenir le comportement que je voulais avec quelque chose comme ça :

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout01" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:padding="10dp">

<TextView 
    android:id="@+id/mytextview1"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true" />

<TextView 
    android:id="@+id/mytextview2"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@id/mytextview1"
    android:gravity="right"/>

</RelativeLayout>

Notez que mon aperçu de texte2 a "android:layout_width" en tant que "match_parent" .

J'espère que cela aidera quelqu'un !

4voto

Taj Mb Points 61
<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Hello world" />

<View
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Gud bye" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X