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

ROMANIA_engineer
la source
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>
Dipak Keshariya
la source
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.

TWiStErRob
la source
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!

Nicolas Asinovich
la source
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.

BobbyD17
la source
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>
NagarjunaReddy
la source
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>
Barbillon
la source
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">
bon
la source
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

Anand S Joshi
la source
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.

Stéphanie Gu
la source
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>
Velraj
la source
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>
Vamsi Challa
la source
0

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

HuynhHan
la source
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é.

Juanjo
la source
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.

Farhan Ghaffar
la source
-2

Utilisez la largeur de mise en page dans le bouton comme android: layout_width = "75dp"

Supprimé en raison de la négativité
la source