Pulsante Allinea a destra in LinearLayout orizzontale


130

Se guardi l'immagine allegata. Ho bisogno che il mio pulsante sia allineato a destra ma per qualche motivo non funziona con "gravità: giusto" ...

Annulla Aggiungi

Ecco il mio codice per quel layout:

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

Perché non funziona ?!


6
Prova il layout relativo in questo caso. LL non funzionerà,
AAnkit,

4
Se si desidera utilizzare LinearLayout, utilizzare due linearlayout interni e utilizzare layout_weight insieme a layout_gravity. Funzionerà benissimo.
Vamsi Challa,

@VamsiChalla è possibile con uno, controlla la mia nuova risposta di seguito.
TWiStErRob,

Risposte:


137

Usa il codice qui sotto per quello

<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
Sembra che l'attributo 'layout_alignParentRight' non sia disponibile per il pulsante in questo caso? Forse obsoleto?

20
ru usando relativelayout invece di linearlayout?
Dipak Keshariya,

1
Ah merda .. Mi dispiace, ho completamente guardato oltre. Grazie!

4
Mi stupisce ancora come qualcosa che sembra così facile diventi così difficile cercando di usare un linearlayout.
AlvaroSantisteban,

2
@DipakKeshariya per i futuri spettatori, potresti usare "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay

145

LinearLayoutSoluzione unica . Aggiungendo solo una vista spaziatura semplice:
(nessuno sembrava aver menzionato questo, solo soluzioni multi-layout più complicate.)

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

Nota la vista "evidenziata", non ho modificato nient'altro. Altezza = 0 assicura che non sia visibile. Larghezza = 0 è perché la larghezza è determinata in LinearLayoutbase al peso = 1. Ciò significa che la vista del distanziatore si allungherà il più possibile nella direzione (orientamento) del LinearLayout.

Si noti che è necessario utilizzare android.widget.Spaceo android.support.v4.widget.SpaceinveceView se il livello API e / o le dipendenze lo consentono. Spaceraggiunge il lavoro in un modo più economico, perché misura solo e non cerca di disegnare nulla di simile View; è anche più espressivo trasmettere l'intenzione.


2
Basta aggiungere android: layout_weight = "1" a R.id.lblExpenseCancel e questo è tutto.
hrules6872,

1
@h_rules funziona se vuoi hackerare, ma immagina cosa succede quando aggiungi lo sfondo a TextView.
TWiStErRob,

2
Mi chiedo perché questa risposta abbia ricevuto un voto negativo, funziona ed è bello, ci proverò sicuramente.
Elvedin Hamzagic,

È perfetto come sviluppatore mobile
Shivanand Darur,

Se aggiungi un distanziatore, in schermi di dimensioni diverse si ottengono risultati diversi. Quindi non è la soluzione ideale.
GeoMint,

29

Vera soluzione per questo caso:

android:layout_weight="1" per TextView e il pulsante si sposta a destra!


28

So che questa domanda è stata posta qualche tempo fa, ma l'ho già fatto in precedenza e mi consente un maggiore controllo durante l'allineamento degli elementi. Se la consideri come una programmazione web, aiuta. Ne annidi un altro LinearLayoutche conterrà il tuo pulsante al suo interno. È quindi possibile modificare la gravità del layout del pulsante e farlo andare a destra mentre TextViewè ancora a sinistra.

Prova questo codice:

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

Potrebbe essere necessario giocare con l'imbottitura sul layout nidificato in modo che agisca come desiderato.


2
È necessario utilizzare un FrameLayout per il layout nidificato. Posizionare un singolo elemento è quello che serve. Inoltre, dagli un peso in modo da riempire la parte giusta del genitore. +1 per non usare il layout relativo comunque.
Hjalmar,

10

prova questo

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

Come accennato un paio di volte prima: Passare da LinearLayout a RelativeLayout funziona, ma puoi anche risolvere il problema invece di evitarlo. Usa gli strumenti forniti da LinearLayout: assegna a TextView un peso = 1 (vedi il codice sotto), il peso per il tuo pulsante dovrebbe rimanere 0 o nessuno. In questo caso, TextView occuperà tutto lo spazio rimanente, che non viene utilizzato per visualizzare il contenuto di TextView o ButtonView e spinge il pulsante verso destra.

<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
Questa è la risposta migliore Volevo solo scrivere qualcosa di simile fino a quando non ho trovato il tuo post.
codingdave,

È molto meglio che passare a RelativeLayoutcausa di problemi di memoria, dal momento che RelativeLayoutconsuma LinearLayout
molta

7

Devi aggiungere gravità al layout, non al pulsante, la gravità nelle impostazioni del pulsante è per Testo all'interno del pulsante

<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
Non sarebbe quindi allineare correttamente anche TextView? Ho solo bisogno che il pulsante sia allineato a destra ...

1
Se è necessario allineare solo il pulsante, utilizzare RelativeLayout.
goodm

1
Anche se vuoi che tutti i pulsanti siano allineati, questo non funziona (API 16). Le viste dei bambini sono ancora allineate a sinistra.
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>

Questo risolverà il tuo problema


3

Se non si desidera o non è possibile utilizzare RelativeLayout, è possibile avvolgere il pulsante in un LinearLayout con orientamento "verticale" e larghezza "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> 

Questo perché se l'orientamento del LinearLayout è orizzontale, la gravità influirà solo sulle viste verticalmente. E se l'orientamento è 'verticale', la gravità influenzerà le viste solo in orizzontale. Vedere qui per maggiori dettagli sulla spiegazione dell'orientamento / gravità LinearLayout.


2

Basta aggiungere android: gravity = "right" questo layout genitore di linea funzionerà.

<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

Ho usato un layout simile con 4 TextViews. Due TextViews dovrebbero essere allineati a sinistra e due TextViews dovrebbero essere allineati a destra. Quindi, ecco la mia soluzione, se si desidera utilizzare LinearLayoutsda solo.

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

Puoi utilizzare RelativeLayout o impostare gravity = "right" sul layout principale del tuo Button.


0

So che questo è vecchio ma eccone un altro in un layout lineare:

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

Nota layout_gravity invece della sola gravità.


Che succede center_vertical|bottom|top? A me sembrano gravità di allineamento esclusive.
TWiStErRob,

0

È necessario utilizzare Relativelayout invece di Linearlayout come layout principale. Se si utilizza Relativelayout come principale, è possibile gestire facilmente il pulsante sul lato destro perché il relativo layout ci fornisce alignParent destra, sinistra, superiore e inferiore.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.