Botón Alinear a la derecha en LinearLayout horizontal

8 minutos de lectura

Si te fijas en la imagen adjunta. Necesito que mi botón esté alineado a la derecha, pero por alguna razón no funciona con ‘gravedad: derecha’…

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

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

    – AAnkit

    31 de mayo de 2012 a las 8:25

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

    – Vamsi Challa

    23 de febrero de 2014 a las 6:29

  • @VamsiChalla es posible con uno, revisa mi nueva respuesta a continuación.

    – TWiStErRob

    23 de marzo de 2015 a las 11:57

avatar de usuario
TWiStErRob

Único LinearLayout solución. Solo agregando una vista de espaciado simple:
(Nadie parecía haber mencionado este, 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. Height=0 se asegura de que no sea visible. Ancho = 0 es porque el ancho está determinado por el LinearLayout basado en el peso = 1. Esto significa que la vista del espaciador se extenderá tanto como sea posible en la dirección (orientación) de la LinearLayout.

Tenga en cuenta que Deberías usar android.widget.Space o android.support.v4.widget.Space en vez de View si su nivel de API y/o dependencias lo permiten. Space logra el trabajo de una manera más económica, porque solo mide y no intenta dibujar nada como View lo hace; también es más expresivo transmitir la intención.

  • Simplemente agregue android:layout_weight=”1″ a R.id.lblExpenseCancel y eso es todo.

    – Héctor6872

    2 de mayo de 2015 a las 13:08

  • @h_rules eso funciona si quieres piratear, pero imagina lo que sucede cuando agregas un fondo a TextView.

    – TWiStErRob

    2 mayo 2015 a las 13:39

  • Me pregunto por qué esta respuesta recibió un voto negativo, funciona y es agradable, lo intentaré definitivamente.

    – Elvedin Hamzagic

    23 mayo 2015 a las 13:44

  • Eso es perfecto como desarrollador móvil.

    – Shivanand Darur

    28 de julio de 2016 a las 9:23

  • @GeoMint layout_weight="1" le da un tamaño dinámico, eso significa “sé tan ancho como puedas” (porque el LinearLayout es horizontal). ancho =0dp es solo para el rendimiento, en realidad no tendrá 0 de ancho. Tengo la sensación de que ni siquiera probaste el código…

    – TWiStErRob

    11/09/2016 a las 21:00


avatar de usuario
Dipak Keshariya

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>

  • Parece que el atributo ‘layout_alignParentRight’ no está disponible para el botón en este caso. ¿En desuso tal vez?

    usuario818700

    31 de mayo de 2012 a las 8:42

  • ¿estás usando un diseño relativo en lugar de un diseño lineal?

    – Dipak Keshariya

    31 de mayo de 2012 a las 8:44

  • Ah, mierda… Lo siento, pasé completamente por alto eso. ¡Gracias!

    usuario818700

    31 de mayo de 2012 a las 8:53

  • Todavía me sorprende cómo algo que parece tan fácil se vuelve tan difícil al tratar de usar un diseño lineal.

    – Álvaro Santisteban

    23 mayo 2014 a las 11:52

  • @DipakKeshariya para futuros espectadores, puede usar “android:layout_gravity=”top|right” linearlayout

    – Supimpa AllTheWay

    17 dic 2015 a las 22:52

avatar de usuario
nicolas asinovich

Solución real para su caso:

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

Sé que esta pregunta se hizo hace un tiempo, pero ya la he hecho antes y permite un mayor control al alinear elementos. Si lo ves como programación web, ayuda. Solo anidas otro LinearLayout que contendrá su botón dentro de él. Luego puede cambiar la gravedad del diseño del botón y hacer que vaya a la derecha mientras el TextView todaví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>

Es posible que deba jugar con el relleno en el diseño anidado para que actúe como lo desea.

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>

avatar de usuario
Lengüeta

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. Use las herramientas que proporciona LinearLayout: asigne a TextView un peso = 1 (vea el código a continuación), el peso de su botón debe permanecer 0 o ninguno. En este caso, TextView tomará todo el espacio restante, que no se usa para mostrar el contenido de su TextView o ButtonView y empuja su 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>

avatar de usuario
bien

Debe agregar gravedad al diseño, no al 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">

  • ¿Eso no alinearía también el TextView correctamente? Solo necesito que el botón esté alineado a la derecha…

    usuario818700

    31 de mayo de 2012 a las 8:38

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

    – bueno

    31 de mayo de 2012 a las 8:44

  • Incluso si desea alinear todos los botones, esto no funciona (API 16). Las vistas de los niños todavía están alineadas a la izquierda.

    – m0skit0

    17 mayo 2017 a las 18:24


¿Ha sido útil esta solución?