android - widgets - Como alinhar vistas na parte inferior da tela?




ui elements android (12)

Aqui está o meu código de layout;

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

O que isso parece está do lado esquerdo e o que eu quero que pareça está à direita.

A resposta óbvia é definir o TextView como fill_parent na altura, mas isso não deixa espaço para o botão ou campo de entrada. Essencialmente, a questão é que eu quero que o botão de envio e a entrada de texto tenham uma altura fixa na parte inferior e a visualização de texto preencha o restante do espaço, da mesma forma no layout Linear horizontal Eu quero o botão enviar para embrulhar seu conteúdo para a entrada de texto para preencher o restante do espaço.

Se o primeiro item em um Layout Linear for informado para fill_parent, ele faz exatamente isso, não deixando espaço para outros itens, como obter um item que seja o primeiro em um layout linear para preencher todo o espaço além do mínimo exigido pelo restante os itens no layout?

EDITAR:

Layouts Relativos foram de fato a resposta - Obrigado!

    <?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.Use ConstraintLayout no layout raiz

E definir app:layout_constraintBottom_toBottomOf="parent" para deixar o layout na parte inferior da tela

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>

FrameLayout Use FrameLayout no layout raiz

Basta definir android:layout_gravity="bottom" no seu layout

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

LinearLayout Use LinearLayout no layout raiz ( android:orientation="vertical" )

(1) Definir um layout android:layout_weight="1" no topo do seu layout

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

(2) Defina o LinearLayout filho para android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"

O atributo principal é ndroid:gravity="bottom" , deixe a criança Ver na parte inferior do Layout.

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

4. Use RelativeLayout no layout raiz

E defina android:layout_alignParentBottom="true" para deixar o layout na parte inferior da tela

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">
</LinearLayout>

SAÍDA


A maneira moderna de fazer isso é ter um ConstraintLayout e restringir a parte inferior da visualização à parte inferior do ConstraintLayout com app:layout_constraintBottom_toBottomOf="parent"

O exemplo abaixo cria um FloatingActionButton que será alinhado ao final e à parte inferior da tela.

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

Para referência, vou manter minha velha resposta.
Antes da introdução do ConstraintLayout, a resposta era um layout relativo .

Se você tiver um layout relativo que preencha toda a tela, use o android:layout_alignParentBottom para mover o botão para a parte inferior da tela.

Se as suas visualizações na parte inferior não forem exibidas em um layout relativo, talvez o layout acima ocupe todo o espaço. Nesse caso, você pode colocar a visualização que deve estar na parte inferior, primeiro no arquivo de layout e posicionar o restante do layout acima das visualizações com android:layout_above . Isso permite que a vista inferior ocupe todo o espaço necessário e o restante do layout possa preencher todo o restante da tela.


Caso você tenha uma hierarquia como esta:

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

Primeiro, aplique android:fillViewport="true" ao ScrollView e aplique android:layout_alignParentBottom="true" ao LinearLayout .

Isso funcionou para mim perfeitamente.

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

Continuando com a solução elegante de Timores, descobri que o seguinte cria um preenchimento vertical em um LinearLayout vertical e um preenchimento horizontal em um LinearLayout horizontal:

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

Em um ScrollView isso não funciona, pois o RelativeLayout então se sobrepõe ao que estiver no ScrollView na parte inferior da página.

Eu FrameLayout usando um FrameLayout alongamento 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>

Eu usei a solução que Janusz postou, mas adicionei padding ao último View, já que a parte superior do meu layout era um ScrollView. O ScrollView ficará parcialmente oculto conforme cresce com o conteúdo. Usando o android: paddingBottom na última View ajuda a mostrar todo o conteúdo no ScrollView.


Isso também 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>


Para um caso como este, use sempre RelativeLayouts. Um LinearLayout não é destinado 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>

Use android:layout_alignParentBottom="true" no seu <RelativeLayout> .

Isso definitivamente vai ajudar.


Você nem precisa aninhar o segundo layout relative dentro do primeiro. Basta usar o android:layout_alignParentBottom="true" no Button e EditText .


Você pode manter seu layout linear inicial aninhando o layout relativo no layout linear:

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

Você pode simplesmente dar ao seu principal filho (o TextView @ + id / TextView ) um atributo: android:layout_weight="1" .

Isso forçará todos os outros elementos abaixo para baixo.





android-layout