Botón Alinear a la derecha en Diseño lineal lineal


130

Si miras la imagen adjunta. Necesito que mi botón esté alineado a la derecha, pero por alguna razón no funciona con 'gravedad: correcto' ...

Cancelar Agregar

Aquí está mi código para ese diseño:

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

¿Por qué no funciona?


66
Pruebe el diseño relativo en este caso. LL no funcionará,
AAnkit

44
Si desea usar LinearLayout, use dos diseños lineales internos y use layout_weight junto con layout_gravity. Funcionará bien
Vamsi Challa

@VamsiChalla es posible con uno, verifique mi nueva respuesta a continuación.
TWiStErRob

Respuestas:


137

Use el siguiente código para eso

<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
Parece que el atributo 'layout_alignParentRight' no está disponible para el botón en este caso? ¿En desuso quizás?

20
¿estás usando relativo relativo en lugar de lineal?
Dipak Keshariya

1
Ah mierda. Lo siento, miré más allá de eso. ¡Gracias!

44
Todavía me sorprende cómo algo que parece tan fácil se vuelve tan difícil tratar de usar una distribución lineal.
AlvaroSantisteban

2
@DipakKeshariya para futuros espectadores, puede usar "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay

145

LinearLayoutSolución única Solo agregando una vista de espaciado simple:
(Nadie parecía haber mencionado esta, solo soluciones de diseño múltiple más complicadas).

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

Tenga en cuenta la Vista "resaltada", no modifiqué nada más. Altura = 0 se asegura de que no sea visible. Ancho = 0 es porque el ancho está determinado por el LinearLayoutbasado en peso = 1. Esto significa que la vista del espaciador se estirará tanto como sea posible en la dirección (orientación) del LinearLayout.

Tenga en cuenta que debe usar android.widget.Spaceo en android.support.v4.widget.Spacelugar deView si su nivel de API y / o dependencias lo permiten. Spacelogra el trabajo de una manera más barata, porque solo mide y no intenta dibujar algo como lo Viewhace; También es más expresivo transmitir la intención.


2
Simplemente agregue android: layout_weight = "1" a R.id.lblExpenseCancel y eso es todo.
hrules6872

1
@h_rules que funciona si quieres hackear, pero imagina lo que sucede cuando agregas fondo a TextView.
TWiStErRob

2
Me pregunto por qué esta respuesta recibió un voto negativo, funciona y es bueno, lo intentaré definitivamente
Elvedin Hamzagic

Eso es perfecto como desarrollador móvil
Shivanand Darur

Si agrega un espaciador, en diferentes tamaños de pantalla tendrá un resultado diferente. Entonces no es la solución ideal.
GeoMint

29

Solución real para el caso:

android:layout_weight="1" para TextView, y su botón se mueve hacia la derecha!


28

Sé que esta pregunta se hizo hace un tiempo, pero lo he hecho antes y permite un mayor control al alinear elementos. Si lo miras como programación web, ayuda. Simplemente anidas otro LinearLayoutque contendrá tu botón dentro de él. A continuación, puede cambiar la gravedad del diseño del botón y hacer que vaya hacia la derecha mientras TextViewtodavía está a la izquierda.

Prueba este código:

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

Puede que tenga que jugar con el relleno en el diseño anidado para que actúe como lo desee.


2
Debe usar un FrameLayout para su diseño anidado. Para posicionar un solo elemento es para lo que sirve. Y también, dele un peso para que llene la parte correcta del padre. +1 por no utilizar el diseño relativo de todos modos.
Hjalmar

10

prueba este

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

Como se mencionó un par de veces antes: cambiar de LinearLayout a RelativeLayout funciona, pero también puede resolver el problema en lugar de evitarlo. Utilice las herramientas que proporciona LinearLayout: asigne a TextView un peso = 1 (consulte el código a continuación), el peso de su botón debe permanecer 0 o ninguno. En este caso, TextView ocupará todo el espacio restante, que no se utiliza para mostrar el contenido de TextView o ButtonView y empuja el botón hacia la derecha.

<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
Esta es la mejor respuesta. Solo quería escribir algo similar hasta que encontrara tu publicación.
codingdave

Eso es mucho mejor que cambiar RelativeLayoutdebido a problemas de memoria, ya que RelativeLayoutconsume mucha más memoria queLinearLayout
ThunderWiring

7

Debe agregar gravedad al diseño, no el botón, la gravedad en la configuración del botón es para el texto dentro del botón

<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
¿No alinearía eso TextView correctamente también? Solo necesito el botón alineado a la derecha ...

1
Si necesita alinear solo el botón, use RelativeLayout.
Goodm

1
Incluso si desea que todos los botones estén alineados, esto no funciona (API 16). Las vistas de los niños siguen alineadas a la izquierda.
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>

Esto resolverá su problema


3

Si no desea o no puede usar RelativeLayout, puede ajustar el botón en LinearLayout con orientación "vertical" y ancho "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> 

Esto se debe a que si la orientación de LinearLayout es horizontal, la gravedad solo afectará las vistas verticalmente. Y si la orientación es 'vertical', la gravedad solo afectará las vistas horizontalmente. Consulte aquí para obtener más detalles sobre la explicación de orientación / gravedad de LinearLayout.


2

Simplemente agregue android: gravity = "right" esta línea de diseño principal, esto funcionará.

<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

He usado un diseño similar con 4 TextViews. Dos TextViews deben estar alineados a la izquierda y dos TextViews deben estar alineados a la derecha. Entonces, aquí está mi solución, si quieres usarlo LinearLayoutssolo.

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

Puede usar RelativeLayout o establecer gravity = "right" en el diseño principal de su Botón.


0

Sé que esto es viejo, pero aquí hay otro en un diseño lineal que sería:

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

Tenga en cuenta el layout_gravity en lugar de solo la gravedad.


¿Qué pasa con center_vertical|bottom|top? Me parecen gravitaciones de alineación exclusivas.
TWiStErRob

0

Debería utilizar la distribución relativa en lugar de la distribución lineal como diseño principal. Si usa Relativelayout como principal, maneje fácilmente el botón en el lado derecho porque el diseño relativo nos proporciona alinearParente a la derecha, izquierda, arriba y abajo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.