¿Cómo puedo alinear vistas en la parte inferior de la pantalla?
-
24-09-2019 - |
Pregunta
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 está a la izquierda y lo que quiero que se vea como está a la derecha.
La respuesta obvia es establecer la Vista de Texto a fill_parent en la altura, pero esto hace que no hay espacio para dejarse para el botón o campo de entrada.
En esencia, 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. Del mismo modo, en el lineal horizontal Disposición Quiero que el botón de enviar para envolver su contenido y para el ingreso de texto para llenar el resto del espacio.
Si el primer elemento de un diseño lineal se le dice que fill_parent que hace exactamente eso, sin dejar espacio para otros artículos. ¿Cómo consigo un elemento que sea por primera vez en una disposición lineal para llenar todo el espacio aparte del mínimo requerido por el resto de los elementos en el esquema?
diseños relativos fueron de hecho la respuesta:
<?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>
Solución
La forma moderna de hacer esto es tener un ConstraintLayout y restringir la parte inferior de la vista a la parte inferior de la ConstraintLayout con app:layout_constraintBottom_toBottomOf="parent"
El siguiente ejemplo crea un FloatingActionButton que se alinea con el extremo y la parte inferior de la pantalla.
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
A modo de referencia, voy a mantener mi vieja respuesta.
Antes de la introducción de ConstraintLayout la respuesta fue un disposición relativa .
Si usted tiene una disposición relativa que ocupe toda la pantalla debe ser capaz de utilizar android:layout_alignParentBottom
para mover el botón a la parte inferior de la pantalla.
Si sus puntos de vista en la parte inferior no se muestran en una disposición relativa a continuación, tal vez la disposición anterior que se necesita todo el espacio. En este caso se puede poner la vista, que debe estar en la parte inferior, por primera vez en el archivo de diseño y coloque el resto de la disposición por encima de los puntos de vista con android:layout_above
. Esto permite que la vista desde abajo para tomar todo el espacio que necesita, y el resto de la disposición puede llenar todo el resto de la pantalla.
Otros consejos
En un ScrollView
esto no funciona, ya que el RelativeLayout
entonces se superponen lo que está en el ScrollView
en la parte inferior de la página.
I fija utilizando un FrameLayout
dinámicamente estiramiento:
<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>
Usted puede mantener su diseño lineal inicial por los nidos de la disposición relativa dentro de la disposición 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 del todo correcto, pero yo personalmente no me siento 100% cómodo con RelativeLayouts, así que prefiero introducir un 'relleno', TextView vacío, de esta manera:
<!-- filler -->
<TextView android:layout_height="0dip"
android:layout_width="fill_parent"
android:layout_weight="1" />
antes de que el elemento que debe estar en la parte inferior de la pantalla.
Se puede hacer esto con un LinearLayout o una ScrollView, también. A veces es más fácil de implementar que un RelativeLayout. Lo único que tiene que hacer es añadir la siguiente vista antes de las vistas que desea alinear a 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 los próximos vistas a 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>
1. Utilice ConstraintLayout
en la raíz de su diseño
Y app:layout_constraintBottom_toBottomOf="parent"
conjunto para que el diseño de la parte inferior de la pantalla:
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>
2. Utilice FrameLayout
en la raíz de su diseño
El sistema justo android:layout_gravity="bottom"
en su diseño
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal">
</LinearLayout>
3. Utilice LinearLayout
en su raíz de disposición (android:orientation="vertical"
)
(1) Establecer un android:layout_weight="1"
diseño en la parte superior de la distribución de su
<TextView
android:id="@+id/TextView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="welcome" />
(2) Conjunto del LinearLayout
hijo para android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
El atributo principal es ndroid:gravity="bottom"
, dejar que el niño vea en la parte inferior del diseño.
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
android:orientation="horizontal">
</LinearLayout>
4. Uso RelativeLayout
en la raíz de disposición
Y conjunto android:layout_alignParentBottom="true"
a dejar que el diseño en la parte inferior de la pantalla
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
</LinearLayout>
Salida
El seguimiento de de Timores solución elegante , he encontrado que la siguiente crea un relleno vertical en un LinearLayout vertical y horizontal de un relleno en un LinearLayout horizontal:
<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
Usted no necesita ni siquiera para anidar el segundo diseño relative
dentro de la primera. Sólo tiene que utilizar el android:layout_alignParentBottom="true"
en el botón y EditarTexto .
Si no desea hacer muchos cambios, entonces usted podría simplemente poner:
android:layout_weight="1"
para la 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>
La creación de ambos cabecera y pie de página , aquí es un ejemplo:
Disposición XML
<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
Utilizar el siguiente código. Alinear el botón para boton. Que está funcionando.
<?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>
En un caso como éste, utilice siempre RelativeLayouts. A LinearLayout no está destinado para el uso de tales a.
<?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>
Uso android:layout_alignParentBottom="true"
en su <RelativeLayout>
.
Esto sin duda ayuda.
En caso de que tenga una jerarquía de esta manera:
<ScrollView>
|-- <RelativeLayout>
|-- <LinearLayout>
En primer lugar, se aplica a la android:fillViewport="true"
ScrollView
y luego aplicar android:layout_alignParentBottom="true"
a la LinearLayout
.
Esto me funcionó perfectamente.
<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>
Sólo puede dar a su niño, vista superior (la Vista de Texto @ + / Identificación del TextView ) un atributo:
android:layout_weight="1"
.
Esto obligará a todos los otros elementos por debajo de ella a la parte inferior.
I utiliza la solución Janusz publicado, pero añade el relleno a la última vista desde la parte superior de mi diseño era un ScrollView.
El ScrollView se ocultará parcialmente a medida que crece con el contenido. Usando android:paddingBottom
en la última Vista ayuda a mostrar todo el contenido en el ScrollView.
Esto se puede hacer con un diseño lineal también.
Sólo proporciona Altura = 0DP y peso = 1 a la disposición arriba y el que desee en la parte inferior. Sólo tiene que escribir height = contenido de envoltura y sin peso.
Proporciona contenido de envoltura para el diseño (la que contiene la edición de texto y un botón) y luego el que tiene el peso ocupa el resto de la disposición.
Esto lo descubrí por accidente.