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




xml android (12)

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>

El aspecto que tiene está a la izquierda y el aspecto que quiero que tenga a la derecha.

La respuesta obvia es configurar 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 tengan una altura fija en la parte inferior y que la vista de texto llene el resto del espacio, de manera similar en el diseño lineal horizontal Quiero que el botón de envío incluya su contenido y para que la entrada de texto llene el resto del espacio.

Si al primer elemento de un diseño lineal se le indica que se llene con paterno, hace exactamente eso, sin dejar espacio para otros elementos, ¿cómo puedo obtener un elemento que sea 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>

1.Utilice ConstraintLayout en su diseño de raíz

Y configura la app:layout_constraintBottom_toBottomOf="parent" para 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:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>

2.Utilice FrameLayout en el diseño de su raíz

Solo establece android:layout_gravity="bottom" en tu 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. Use LinearLayout en su diseño de raíz ( android:orientation="vertical" )

(1) Establezca un android:layout_weight="1" diseño android:layout_weight="1" en la parte superior de su diseño

<TextView
    android:id="@+id/TextView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="welcome" />

(2) Establezca el LinearLayout secundario para android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"

El atributo principal es ndroid:gravity="bottom" , que el niño vea en la parte inferior de Layout.

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="horizontal">
</LinearLayout>

4.Utilice RelativeLayout en el diseño raíz

Y configure android:layout_alignParentBottom="true" para permitir 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


Creando tanto HEADER como 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 ]

Espero que esto sea de ayuda. ¡¡Gracias!!


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>

En un ScrollView esto no funciona, ya que RelativeLayout se superpondría con lo que haya en el ScrollView en la parte inferior de la página.

Lo arreglé usando un FrameLayout dinámicamente extendido:

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

Esto también se puede hacer con un diseño lineal. Simplemente proporcione Altura = 0dp y peso = 1 al diseño anterior y el que desee en la parte inferior, simplemente escriba altura = contenido de envoltura y sin peso. Lo que hace es que proporciona contenido de ajuste para el diseño (el que contiene el texto y el botón de edición) y luego el que tiene peso ocupa el resto del diseño. Descubrí esto por accidente.


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

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


Para un caso como este siempre use RelativeLayouts. Un LinearLayout no está diseñado 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>

Puede mantener su diseño lineal inicial anidando el diseño relativo 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>

Siguiendo con 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" />

Solo puede asignar a su vista superior (el TextView @ + id / TextView ) un atributo: android:layout_weight="1" .

Esto forzará a todos los demás elementos debajo de él hacia abajo


Use android:layout_alignParentBottom="true" en su <RelativeLayout> .

Esto definitivamente ayudará.


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





android-layout