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’…
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?!
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 elLinearLayout
eshorizontal
). 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
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
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>
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>
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
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