Bouton d'alignement à droite dans la mise en page linéaire horizontale


130

Si vous regardez l'image ci-jointe. J'ai besoin que mon bouton soit aligné à droite mais pour une raison quelconque, il ne fonctionne pas avec `` gravité: droite '' ...

Annuler Ajouter

Voici mon code pour cette mise en page:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Pourquoi ne fonctionne pas?!


6
Essayez la mise en page relative dans ce cas. LL ne fonctionnera pas,
AAnkit

4
Si vous souhaitez utiliser LinearLayout, utilisez deux layouts linéaires internes et utilisez layout_weight avec layout_gravity. Cela fonctionnera très bien.
Vamsi Challa

@VamsiChalla c'est possible avec un, vérifiez ma nouvelle réponse ci-dessous.
TWiStErRob

Réponses:


137

Utilisez le code ci-dessous pour cela

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="35dp"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="9dp"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/stitch_button"
        android:text="@string/add" />

</RelativeLayout>

3
Il semble que l'attribut «layout_alignParentRight» n'est pas disponible pour le bouton dans ce cas? Obsolète peut-être?

20
ru en utilisant relativelayout au lieu de linearlayout?
Dipak Keshariya

1
Ah merde .. Désolé pour ça, j'ai complètement regardé au-delà de ça. Merci!

4
Je suis toujours étonné de voir à quel point quelque chose qui semble si facile devient si difficile d'essayer d'utiliser une disposition linéaire.
AlvaroSantisteban

2
@DipakKeshariya pour les futurs téléspectateurs, vous pouvez utiliser "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay

145

LinearLayoutSolution unique . Ajout seulement d'une vue d'espacement simple:
(Personne ne semblait avoir mentionné celle-ci, seulement des solutions multi-mises en page plus compliquées.)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <!-------------------------  ADDED SPACER VIEW -------------------->
    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1"
        />
    <!------------------------- /ADDED SPACER VIEW -------------------->

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Notez la vue "en surbrillance", je n'ai rien modifié d'autre. Height = 0 garantit qu'il n'est pas visible. Width = 0 est dû au fait que la largeur est déterminée par la LinearLayoutbase de poids = 1. Cela signifie que la vue d'espacement s'étendra autant que possible dans la direction (orientation) du LinearLayout.

Notez que vous devez utiliser android.widget.Spaceou à la android.support.v4.widget.Spaceplace deView si votre niveau d'API et / ou vos dépendances le permettent. Spaceaccomplit le travail d'une manière moins coûteuse, car il ne mesure et n'essaie pas de dessiner quelque chose comme le Viewfait; c'est aussi plus expressif pour transmettre l'intention.


2
Ajoutez simplement android: layout_weight = "1" à R.id.lblExpenseCancel et c'est tout.
hrules6872

1
@h_rules qui fonctionne si vous voulez pirater, mais imaginez ce qui se passe lorsque vous ajoutez un arrière-plan à TextView.
TWiStErRob

2
Je me demande pourquoi cette réponse a été rejetée, ça marche et c'est bien, je vais l'essayer définitivement.
Elvedin Hamzagic

C'est parfait en tant que développeur mobile
Shivanand Darur

Si vous ajoutez un espaceur, vous obtenez un résultat différent dans différentes tailles d'écran. Ce n'est donc pas la solution idéale.
GeoMint du

30

Véritable solution pour ce cas:

android:layout_weight="1" pour TextView, et votre bouton se déplace vers la droite!


28

Je sais que cette question a été posée il y a quelque temps, mais je l'ai déjà fait et cela permet plus de contrôle lors de l'alignement des éléments. Vous venez d'en imbriquer un autre LinearLayoutqui contiendra votre bouton à l'intérieur. Vous pouvez ensuite modifier la gravité de la disposition du bouton et le faire aller vers la droite tandis que le TextViewest toujours sur la gauche.

Essayez ce code:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel" 
    android:textColor="#404040"         
    android:layout_marginLeft="10dp" 
    android:textSize="20sp" 
    android:layout_marginTop="9dp"/>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Vous devrez peut-être jouer avec le remplissage sur la mise en page imbriquée pour qu'il agisse comme vous le souhaitez.


2
Vous devez utiliser un FrameLayout pour votre mise en page imbriquée. Pour positionner un seul élément, c'est à quoi ça sert. Et aussi, donnez-lui un poids pour qu'il remplisse la bonne partie du parent. +1 pour ne pas utiliser de disposition relative de toute façon.
Hjalmar

10

essaye celui-là

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_gravity="right" 
    android:layout_height="wrap_content"             
    android:orientation="horizontal"  >

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
   android:layout_height="wrap_content"   
   android:orientation="horizontal" >

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="9dp"
    android:text="cancel"
    android:textColor="#ffff0000"
    android:textSize="20sp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="15dp"
     android:textColor="#ff0000ff"
    android:text="add" />

 </RelativeLayout>
  </LinearLayout>

9

Comme mentionné à quelques reprises auparavant: passer de LinearLayout à RelativeLayout fonctionne, mais vous pouvez également résoudre le problème au lieu de l'éviter. Utilisez les outils fournis par LinearLayout: Donnez au TextView un poids = 1 (voir le code ci-dessous), le poids de votre bouton doit rester 0 ou aucun. Dans ce cas, TextView occupera tout l'espace restant, qui n'est pas utilisé pour afficher le contenu de votre TextView ou ButtonView et pousse votre bouton vers la droite.

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="35dp">

        <TextView
            android:id="@+id/lblExpenseCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cancel"
            android:textColor="#404040"
            android:layout_marginLeft="10dp"
            android:textSize="20sp"
            android:layout_marginTop="9dp"

            **android:layout_weight="1"**

            />

        <Button
            android:id="@+id/btnAddExpense"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:background="@drawable/stitch_button"
            android:layout_marginLeft="10dp"
            android:text="@string/add"
            android:layout_gravity="right"
            android:layout_marginRight="15dp" />

    </LinearLayout>

2
C'est la meilleure réponse. Je voulais juste écrire quelque chose de similaire jusqu'à ce que je trouve votre message.
codingdave

C'est bien mieux que de passer à en RelativeLayoutraison de problèmes de mémoire, car il RelativeLayoutconsomme beaucoup plus de mémoire queLinearLayout
ThunderWiring

7

Vous devez ajouter de la gravité à la mise en page et non au bouton, la gravité dans les paramètres du bouton est pour le texte à l'intérieur du bouton

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_gravity="right" 
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">

2
Est-ce que cela n'alignerait pas également le TextView à droite? J'ai juste besoin du bouton aligné à droite ...

1
Si vous devez aligner uniquement le bouton, utilisez RelativeLayout.
goodm

1
Même si vous voulez que tous les boutons soient alignés, cela ne fonctionne pas (API 16). Les vues des enfants sont toujours alignées sur la gauche.
m0skit0

5
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"             
    android:orientation="horizontal" 
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:text="@string/cancel" 
        android:textColor="#404040"         
        android:layout_marginLeft="10dp" 
        android:textSize="20sp" 
        android:layout_marginTop="9dp"/>              

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Cela résoudra votre problème


3

Si vous ne voulez pas ou ne pouvez pas utiliser RelativeLayout, vous pouvez envelopper le bouton dans un LinearLayout avec l'orientation "vertical" et la largeur "fill_parent".

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_marginTop="35dp">

  <TextView
      android:id="@+id/lblExpenseCancel"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/cancel"
      android:textColor="#404040"
      android:layout_marginLeft="10dp"
      android:textSize="20sp"
      android:layout_marginTop="9dp" />

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
     <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />
  </LinearLayout>
</LinearLayout> 

En effet, si l'orientation de LinearLayout est horizontale, la gravité n'affectera que les vues verticalement. Et si l'orientation est «verticale», la gravité n'affectera que les vues horizontalement. Voir ici pour plus de détails sur l'orientation / la gravité de LinearLayout.


2

Ajoutez simplement android: gravity = "right" cette disposition parente en ligne, cela fonctionnera.

<LinearLayout
        android:id="@+id/withdrawbuttonContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"
        android:orientation="horizontal"
        **android:gravity="right"**
        android:weightSum="5"
        android:visibility="visible">

        <Button
            android:id="@+id/bt_withDraw"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_ADD"
            app:delay="1500" />

        <Button
            android:id="@+id/btn_orderdetail_amend"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_CANCEL"
            app:delay="1500" />
</LinearLayout>

0

J'ai utilisé une mise en page similaire avec 4 TextViews. Deux TextViews doivent être alignés à gauche et deux TextViews doivent être alignés à droite. Alors, voici ma solution, si vous souhaitez l'utiliser LinearLayoutsseul.

<?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="wrap_content"
    android:orientation="horizontal"
    android:baselineAligned="false"
    android:padding="10dp" >

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="left"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/level"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="right"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/time"
            android:textAppearance="?android:attr/textAppearanceMedium"
             />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" 
            />
    </LinearLayout>

</LinearLayout>

0

Vous pouvez utiliser RelativeLayout ou définir gravity = "right" sur la disposition parent de votre Button.


0

Je sais que c'est vieux, mais en voici un autre dans une mise en page linéaire:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel"
    android:textColor="#404040"
    android:layout_marginLeft="10dp"
    android:textSize="20sp"
    android:layout_marginTop="9dp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:background="@drawable/stitch_button"
    android:layout_marginLeft="10dp"
    android:text="@string/add"
    android:layout_gravity="center_vertical|bottom|right|top"
    android:layout_marginRight="15dp" />

Veuillez noter le layout_gravity par opposition à la simple gravité.


Quoi de neuf center_vertical|bottom|top? Ils ressemblent à des gravités d'alignement exclusives pour moi.
TWiStErRob

0

Vous devez utiliser la disposition relative au lieu de la disposition linéaire comme disposition principale. Si vous utilisez Relativelayout comme principal, manipulez facilement le bouton sur le côté droit car la disposition relative nous fournit alignParent droite, gauche, haut et bas.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.