¿Cómo alinear vistas en la parte inferior de la pantalla?

Aquí está mi código de diseño;

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="@string/welcome" android:id="@+id/TextView" android:layout_width="fill_parent" android:layout_height="wrap_content"> </TextView> <LinearLayout android:id="@+id/LinearLayout" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="bottom"> <EditText android:id="@+id/EditText" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <Button android:text="@string/label_submit_button" android:id="@+id/Button" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> </LinearLayout> </LinearLayout> 

Lo que esto parece es a la izquierda y lo que quiero que parezca es a la derecha.

Disposición de Android: real (izquierda) y deseada (derecha)

La respuesta obvia es establecer el TextView para fill_parent en altura, pero esto no deja espacio para el botón o el campo de entrada. Esencialmente el problema es que quiero que el botón de envío y la entrada de texto para ser una altura fija en la parte inferior y la vista de texto para llenar el resto del espacio, de manera similar en la disposición lineal horizontal Deseo que el botón de envío para envolver su contenido y Para que la entrada de texto llene el resto del espacio.

Si se le dice al primer elemento de un Linear Layout que llene_parent hace exactamente eso, no dejando lugar a otros elementos, ¿cómo puedo obtener un elemento que es el primero en un diseño lineal para llenar todo el espacio aparte del mínimo requerido por el resto de Los elementos en el diseño?

EDITAR:

Disposiciones relativas fueron de hecho la respuesta – ¡Gracias!

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="@string/welcome" android:id="@+id/TextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true"> </TextView> <RelativeLayout android:id="@+id/InnerRelativeLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <Button android:text="@string/label_submit_button" android:id="@+id/Button" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> <EditText android:id="@+id/EditText" android:layout_width="fill_parent" android:layout_toLeftOf="@id/Button" android:layout_height="wrap_content"> </EditText> </RelativeLayout> </RelativeLayout> 

Creo que deberías probar un diseño relativo .
Si tienes un diseño relativo que llena toda la pantalla deberías poder usar android:layout_alignParentBottom para mover el botón a la parte inferior de la pantalla.

Si sus vistas en la parte inferior no se muestran en un diseño relativo, entonces tal vez el diseño anterior toma todo el espacio. En este caso, puedes colocar la vista que debería estar en la parte inferior, primero en el archivo de diseño y colocar el resto del diseño encima de las vistas con android:layout_above . Esto permite que la vista inferior ocupe el espacio que necesita y el resto del diseño puede llenar todo el resto de la pantalla.

En ScrollView esto no funciona, ya que el RelativeLayout se superpone a lo que está en ScrollView en la parte inferior de la página.

Lo arreglé utilizando un FrameLayout estiramiento FrameLayout :

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:fillViewport="true"> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <!-- content goes here --> <!-- stretching frame layout, using layout_weight --> <FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> <!-- content fixated to the bottom of the screen --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- your bottom content --> </LinearLayout> </LinearLayout> </ScrollView> 

Puede mantener su disposición lineal inicial anidando la disposición relativa dentro del diseño lineal:

 <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="welcome" android:id="@+id/TextView" android:layout_width="fill_parent" android:layout_height="wrap_content"> </TextView> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="submit" android:id="@+id/Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"> </Button> <EditText android:id="@+id/EditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/Button" android:layout_alignParentBottom="true"> </EditText> </RelativeLayout> </LinearLayout> 

La respuesta anterior (por Janusz) es bastante correcta, pero personalmente no me siento 100% cómodo con RelativeLayouts, así que prefiero introducir un 'relleno', vacío TextView, así:

 <!-- filler --> <TextView android:layout_height="0dip" android:layout_width="fill_parent" android:layout_weight="1" /> 

Antes del elemento que debe estar en la parte inferior de la pantalla.

Esto también funciona.

 <LinearLayout android:id="@+id/linearLayout4" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_below="@+id/linearLayout3" android:layout_centerHorizontal="true" android:orientation="horizontal" android:gravity="bottom" android:layout_alignParentBottom="true" android:layout_marginTop="20dp" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> 

Gravity = "bottom" para flotar elementos LinearLayout a fondo

También puede hacerlo con LinearLayout o ScrollView. A veces es más fácil implementar entonces un RelativeLayout. Lo único que debe hacer es agregar la siguiente vista antes de las Vistas que desea alinear en la parte inferior de la pantalla:

 <View android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" /> 

Esto crea una vista vacía, llenando el espacio vacío y empujando las vistas siguientes a la parte inferior de la pantalla.

Ni siquiera necesita anidar el segundo diseño relative dentro del primero. Simplemente utilice el android:layout_alignParentBottom="true" en el botón y EditText .

Siguiendo la elegante solución de Timores, he descubierto que lo siguiente crea un relleno vertical en un LinearLayout vertical y un relleno horizontal en un LinearLayout horizontal:

 <Space android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> 

Si usted no desea hacer muchos cambios, entonces usted podría poner:

 android:layout_weight="1" 

Para el TextView que tiene ID como @+id/TextView es decir

 <TextView android:text="@string/welcome" android:id="@+id/TextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"> </TextView> 

Creación de HEADER y FOOTER, aquí hay un ejemplo

[XML de diseño]

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/backgroundcolor" tools:context=".MainActivity"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="40dp" android:background="#FF0000"> </RelativeLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:background="#FFFF00"> </RelativeLayout> </RelativeLayout> 

[ Captura de pantalla ]

Introduzca aquí la descripción de la imagen

Espero que esto sea útil. ¡¡Gracias!!

Utilice debajo del botón de alineación de código para bottem su funcionamiento

  <?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="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_back" android:layout_width="100dp" android:layout_height="80dp" android:text="Back" /> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.97" android:gravity="center" android:text="Payment Page" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Submit"/> </LinearLayout> </LinearLayout> 

Usa android:layout_alignParentBottom="true" en tu <RelativeLayout> .

Esto definitivamente ayudará.

En caso de tener una jerarquía como esta:

 <ScrollView> |-- <RelativeLayout> |-- <LinearLayout> 

Primero, aplique android:fillViewport="true" al ScrollView y luego aplique android:layout_alignParentBottom="true" al LinearLayout .

Esto funcionó perfectamente para mí.

 <ScrollView android:layout_height="match_parent" android:layout_width="match_parent" android:scrollbars="none" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/linearLayoutHorizontal" android:layout_alignParentBottom="true"> </LinearLayout> </RelativeLayout> </ScrollView> 

Solo puedes darle a tu vista principal (el TextView @ + id / TextView ) un atributo: android:layout_weight="1" .

Esto obligará a todos los demás elementos por debajo de ella a la parte inferior.

Utilicé la solución que Janusz publicó, pero añadí relleno a la última vista, ya que la parte superior de mi diseño era ScrollView. El ScrollView estará parcialmente oculto a medida que crece con el contenido. Uso de android: paddingBottom en la última vista ayuda a mostrar todo el contenido en el ScrollView.

Esto se puede hacer con la disposición lineal demasiado Apenas proporcione la altura = 0dp y peso = 1 a la disposición arriba y la que usted quiere en la parte inferior apenas escribe height = wrap el contenido y ningún peso. Lo que hace es proporcionar contenido de ajuste para el diseño (el que contiene el texto de edición y el botón) y luego el que tiene peso ocupa el resto del diseño. Descubrí esto por accidente.

Para un caso como este siempre use RelativeLayouts. Un LinearLayout no está pensado para tal uso.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/db1_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- Place your layout here --> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="bottom" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingRight="20dp" > <Button android:id="@+id/setup_macroSavebtn" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Save" /> <Button android:id="@+id/setup_macroCancelbtn" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Cancel" /> </LinearLayout> </RelativeLayout> 
  • Hacer un estado seleccionado para textview (resaltado)
  • XML para la programación de Android
  • Java.lang.IllegalStateException: ScrollView puede alojar sólo un hijo directo
  • "El espacio de nombres no está enlazado" en el archivo xml de recursos cuando se inspecciona el código con Android Studio
  • Simple-XML analiza el feed RSS con 2 que se declara dos veces
  • ExpandableListView dentro de una vista de desplazamiento
  • Android: Alineación de cuatro cuadrados
  • Cómo clasificar los componentes de Android según el tamaño de la imagen mediante XML
  • ¿Cómo se consigue dimension.xml (sw600dp) en Android Studio?
  • Crear vista sobre cardview en android
  • Interpolador personalizado de referencia para la animación de vistas en XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.