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 parece está à esquerda e o que eu quero que esteja à direita.
A resposta óbvia é definir o TextView como fill_parent na height, mas isso não deixa espaço para o botão ou campo de entrada.
Essencialmente, o problema é que eu quero que o botão enviar e a entrada de texto tenham uma altura fixa na parte inferior e a exibição de texto para preencher o restante do espaço. Da mesma forma, no layout linear horizontal, desejo que o botão enviar envolva seu conteúdo e que a entrada de texto preencha o restante do espaço.
Se o primeiro item em um layout linear é solicitado a fill_parent, ele faz exatamente isso, não deixando espaço para outros itens. Como obtenho um item que é o primeiro em um layout linear para preencher todo o espaço além do mínimo exigido pelo restante dos itens no layout?
Layouts relativos foram de fato a resposta:
<?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>
Respostas:
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.
Para referência, vou manter minha antiga resposta.
Antes da introdução do ConstraintLayout, a resposta era um layout relativo .
Se você tiver um layout relativo que preencha a tela inteira, poderá usar
android:layout_alignParentBottom
o botão para mover o botão para a parte inferior da tela.Se suas vistas na parte inferior não forem mostradas 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
android:layout_above
. Isso permite que a visualização inferior ocupe o espaço necessário e o restante do layout pode preencher todo o restante da tela.fonte
android:layout_above
?that RelativeLayout
está consumindo memória e deve ser evitado sempre que possível.Em um exemplo,
ScrollView
isso não funciona, pois oRelativeLayout
arquivo se sobrepõe ao que está naScrollView
parte inferior da página.Corrigi-o usando um alongamento dinâmico
FrameLayout
:fonte
Você pode manter seu layout linear inicial, aninhando o layout relativo no layout linear:
fonte
A resposta acima (de Janusz) é bastante correta, mas eu pessoalmente não me sinto 100% confortável com RelativeLayouts, por isso prefiro introduzir um TextView vazio 'preenchedor', assim:
antes do elemento que deve estar na parte inferior da tela.
fonte
Você pode fazer isso com um LinearLayout ou um ScrollView também. Às vezes, é mais fácil de implementar do que um RelativeLayout. A única coisa que você precisa fazer é adicionar a seguinte exibição antes das exibições que você deseja alinhar na parte inferior da tela:
Isso cria uma vista vazia, preenchendo o espaço vazio e empurrando as próximas vistas para a parte inferior da tela.
fonte
Isso também funciona.
fonte
1. Use
ConstraintLayout
em seu layout raizE defina
app:layout_constraintBottom_toBottomOf="parent"
para deixar o Layout na parte inferior da tela:2. Use
FrameLayout
em seu layout raizBasta definir
android:layout_gravity="bottom"
no seu layout3. Use
LinearLayout
em seu layout raiz (android:orientation="vertical"
)(1) Defina um layout
android:layout_weight="1"
na parte superior do seu Layout(2) Defina a criança
LinearLayout
paraandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
O principal atributo é
ndroid:gravity="bottom"
, deixe o filho Visualizar na parte inferior do Layout.4. Use
RelativeLayout
no layout raizE defina
android:layout_alignParentBottom="true"
para deixar o Layout na parte inferior da telaResultado
fonte
Seguindo 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:
fonte
Você nem precisa aninhar o segundo
relative
layout dentro do primeiro. Basta usar oandroid:layout_alignParentBottom="true"
no botão e EditText .fonte
Se você não deseja fazer muitas alterações, basta colocar:
para o TextView com ID como
@+id/TextView
iefonte
Criando cabeçalho e rodapé , aqui está um exemplo:
XML de layout
Captura de tela
fonte
Use o código abaixo. Alinhe o botão ao botão. Está funcionando.
fonte
Para um caso como esse, sempre use RelativeLayouts. Um LinearLayout não se destina a esse uso.
fonte
Use
android:layout_alignParentBottom="true"
no seu<RelativeLayout>
.Isso definitivamente vai ajudar.
fonte
Caso você tenha uma hierarquia como esta:
Primeiro, aplique
android:fillViewport="true"
aoScrollView
e depoisandroid:layout_alignParentBottom="true"
aoLinearLayout
.Isso funcionou para mim perfeitamente.
fonte
Você pode apenas dar a sua visão superior da criança (o TextView @ + id / TextView ) um atributo:
android:layout_weight="1"
.Isso forçará todos os outros elementos abaixo para baixo.
fonte
Isso também pode ser feito com um layout linear.
Basta fornecer Altura = 0dp e peso = 1 para o layout acima e o desejado na parte inferior. Basta escrever a altura = conteúdo do invólucro e sem peso.
Ele fornece conteúdo de quebra automática para o layout (aquele que contém o texto e o botão de edição) e, em seguida, aquele que tem peso ocupa o restante do layout.
Eu descobri isso por acidente.
fonte
Usei a solução que Janusz postou, mas adicionei preenchimento à última visualização, pois a parte superior do meu layout era um ScrollView.
O ScrollView ficará parcialmente oculto à medida que cresce com o conteúdo. O uso
android:paddingBottom
da última visualização ajuda a mostrar todo o conteúdo no ScrollView.fonte