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.

Disposición Android - real (izquierda) y deseado (Derecho )

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>
¿Fue útil?

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>

gravedad = "parte inferior" flotar elementos LinearLayout a abajo

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

Enter descripción de la imagen aquí

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

Enter descripción de la imagen aquí

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top