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>
Esto se ve a la izquierda y lo que quiero que se vea es a la derecha.
La respuesta obvia es establecer TextView en fill_parent en altura, pero esto no deja espacio para el botón o campo de entrada.
Esencialmente, el problema es que quiero que el botón Enviar y la entrada de texto tengan una altura fija en la parte inferior y que la vista de texto llene el resto del espacio. Del mismo modo, en el diseño lineal horizontal, quiero que el botón Enviar ajuste su contenido y que la entrada de texto llene el resto del espacio.
Si se le dice al primer elemento de un diseño lineal que complete_parent, hace exactamente eso, sin dejar espacio para otros elementos. ¿Cómo obtengo un elemento que está 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?
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>
Respuestas:
La forma moderna de hacer esto es tener un RestraintLayout y restringir la parte inferior de la vista al fondo del RestraintLayout con
app:layout_constraintBottom_toBottomOf="parent"
El siguiente ejemplo crea un FloatingActionButton que se alineará con el final y la parte inferior de la pantalla.
Como referencia, mantendré mi vieja respuesta.
Antes de la introducción de ConstraintLayout, la respuesta era un diseño relativo .
Si tiene un diseño relativo que llena toda la pantalla, debería poder usarlo
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 de arriba ocupe todo el espacio. En este caso, puede colocar la vista, que debe estar en la parte inferior, primero en su archivo de diseño y colocar el resto del diseño sobre las vistas con
android:layout_above
. Esto permite que la vista inferior ocupe todo el espacio que necesita, y el resto del diseño puede ocupar todo el resto de la pantalla.fuente
android:layout_above
?that RelativeLayout
que consume memoria y debe evitarse siempre que sea posible.En un caso,
ScrollView
esto no funciona, yaRelativeLayout
que luego se superpondría con lo que esté enScrollView
la parte inferior de la página.Lo arreglé usando un estiramiento dinámico
FrameLayout
:fuente
Puede mantener su diseño lineal inicial anidando el diseño relativo dentro del diseño lineal:
fuente
La respuesta anterior (por Janusz) es bastante correcta, pero personalmente no me siento 100% cómodo con RelativeLayouts, por lo que prefiero presentar un 'relleno', TextView vacío, como este:
antes del elemento que debería estar en la parte inferior de la pantalla.
fuente
También puede hacer esto con LinearLayout o ScrollView. A veces es más fácil de implementar que 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:
Esto crea una vista vacía, llena el espacio vacío y empuja las siguientes vistas a la parte inferior de la pantalla.
fuente
Esto tambien funciona.
fuente
1. Úselo
ConstraintLayout
en su diseño raízY configurar
app:layout_constraintBottom_toBottomOf="parent"
para dejar el diseño en la parte inferior de la pantalla:2. Úselo
FrameLayout
en su diseño raízSolo configura
android:layout_gravity="bottom"
tu diseño3. Úselo
LinearLayout
en su diseño raíz (android:orientation="vertical"
)(1) Establecer un diseño
android:layout_weight="1"
en la parte superior de su diseño(2) Establecer el niño
LinearLayout
paraandroid: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.4. Uso
RelativeLayout
en el diseño raízY configurar
android:layout_alignParentBottom="true"
para dejar que el diseño en la parte inferior de la pantallaSalida
fuente
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:
fuente
Ni siquiera necesita anidar el segundo
relative
diseño dentro del primero. Simplemente use elandroid:layout_alignParentBottom="true"
en el Botón y EditText .fuente
Si no desea hacer muchos cambios, simplemente podría poner:
para el TextView que tiene ID como
@+id/TextView
iefuente
Creando encabezado y pie de página , aquí hay un ejemplo:
XML de diseño
Captura de pantalla
fuente
Usa el siguiente código. Alinee el botón con el botón. Esta funcionando.
fuente
Para un caso como este, use siempre RelativeLayouts. Un LinearLayout no está diseñado para tal uso.
fuente
Uso
android:layout_alignParentBottom="true"
en tu<RelativeLayout>
.Esto definitivamente ayudará.
fuente
En caso de que tenga una jerarquía como esta:
Primero, aplique
android:fillViewport="true"
alScrollView
y luego apliqueandroid:layout_alignParentBottom="true"
alLinearLayout
.Esto funcionó para mí perfectamente.
fuente
Usted sólo puede dar a su vista superior del niño (el TextView @ + / Identificación del TextView ) un atributo:
android:layout_weight="1"
.Esto forzará a todos los demás elementos debajo de él hacia abajo.
fuente
Esto también se puede hacer con un diseño lineal.
Solo proporcione Altura = 0dp y peso = 1 al diseño anterior y al que desea en la parte inferior. Simplemente escriba altura = contenido envolvente y sin peso.
Proporciona contenido de ajuste para el diseño (el que contiene su texto y botón de edición) y luego el que tiene peso ocupa el resto del diseño.
Descubrí esto por accidente.
fuente
Usé la solución que Janusz publicó, pero agregué relleno a la última Vista ya que la parte superior de mi diseño era una Vista de desplazamiento.
ScrollView estará parcialmente oculto a medida que crece con el contenido. El uso
android:paddingBottom
en la última Vista ayuda a mostrar todo el contenido en la Vista de desplazamiento.fuente