Quero mostrar um botão sob a ListView
. O problema é que, se o ListView
for estendido (itens adicionados ...), o botão será empurrado para fora da tela.
Eu tentei um LinearLayout
com pesos (como sugerido no Android: por que não há maxHeight para um View? ), Mas ou achei os pesos errados ou simplesmente não funcionou.
Além disso, encontrei em algum lugar a dica para usar a RelativeLayout
. O ListView
seria então definido acima do botão com o android:layout_above
parâmetro.
O problema com isso é que não sei como posicionar o botão depois. No exemplo que encontrei, a visualização abaixo do ListView
foi ajustada usando android:layout_alignParentBottom
, mas não quero que meu botão grude na parte inferior da tela.
Alguma ideia além de usar o método setHeight e alguns cálculos do espaço necessário?
Edit: recebi muitas respostas úteis.
A solução da bigstone's & user639183 quase funcionou perfeitamente. No entanto, eu tive que adicionar um preenchimento / margem extra na parte inferior do botão, já que ele ainda seria empurrado para fora da tela (mas depois parado)
A resposta de Adinia com o layout relativo só é adequada se você quiser que o botão seja fixado na parte inferior da tela. Não é o que eu pretendia, mas ainda pode ser útil para outras pessoas.
A solução da AngeloS foi a que escolhi no final, pois ela acabou de criar os efeitos que eu queria. No entanto, fiz duas pequenas alterações ao
LinearLayout
redor do botão:Primeiro, como eu não queria ter nenhum valor absoluto em meu layout, mudei
android:layout_height="45px"
parawrap_content
, o que também funciona bem.Em segundo lugar, como eu queria que o botão ficasse centralizado horizontalmente, o que só é suportado pela vertical
LinearLayout
, alterei android :idance = "horizontal" para "vertical".
AngeloS também afirmou em sua postagem inicial que não tinha certeza se o
android:layout_weight="0.1"
parâmetro emLinearLayout
torno doListView
teve algum efeito; Eu apenas tentei e realmente funciona! Sem, o botão é empurrado para fora da tela novamente.
fonte
android:layout_alignParentBottom="true"
. Mas, para ser claro, você deseja que o botão permaneça anexado à parte inferior do ListView quando houver poucos itens? Se sim, veja o que diz Rich.Respostas:
Eu tive esse problema exato e para resolvê-lo criei dois separados
LinearLayouts
para abrigar oListView
eButton
respectivamente. A partir daí, coloco os dois em outroLinear Layout
e configurei o contêinerandroid:orientation
paravertical
. Eu também definir o peso do oLinearLayout
que abrigava aListView
para0.1
, mas não sei se isso tem algum efeito. A partir daí, você pode definir a altura do recipiente inferior (que contém o seu botão) para qualquer altura que desejar.EDITAR isto é o que quero dizer:
A solução acima corrigirá o botão na parte inferior da tela.
Para que o botão flutue na parte inferior da lista, altere a altura de
ListView01
parawrap_content
:fonte
<div
tags em HTML .. é apenas um invólucro e essa solução definitivamente funciona.Resolvi esse problema no código, definindo a altura do listview apenas se ele contiver mais de 5 itens:
Observe que eu defino a altura máxima para 5,5 vezes a altura de um único item, então o usuário saberá com certeza que há alguma rolagem a ser feita! :)
fonte
Em sua última edição, você só precisa adicionar também
android:layout_above="@+id/butt1"
em seu código ListView.E para mostrar a você (e a todos aqui que tentaram uma resposta anteriormente) que você realmente não precisa usar mais de um
RelativeLayout
, aqui está seu código corrigido :e o resultado , usando alguma lista aleatória:
fonte
Usando
LinearLayout
, defina a altura de seuListView
eButton
parawrap_content
e adicione um peso = 1 aListView
. Isso deve funcionar como você deseja.E sim, defina o
layout_gravity
deButton
parabottom
fonte
Encontrou uma maneira de fazer isso sem usar contêineres aninhados, inspirado na solução da AngeloS.
Usei um
LinearLayout
com orientação vertical, que tem umListView
e um botão. Eu defino oandroid:layout_weight="0.1"
para oListView
.Consegue colocar o botão sempre no final da lista. E o botão não é empurrado para fora da tela quando a lista aumenta.
fonte
android:layout_height="wrap_content"
o LinearLayout, como na sua solução, está funcionando perfeitamente, e não apenas no 4.4.3, mas como o Sparkle não mencionou, eu tenteimatch_parent
antes.RelativeLayout
é uma solução, se você não quiser que o botão fique muito perto da parte inferior, você pode adicionar margens (o preenchimento de um botão iria quebrá-lo porque ele usa um fundo de 9 remendos e define seu próprio preenchimento).Seria o mesmo se você usasse a
LinearLayout
: a maneira de conseguir o que deseja é definir oListView
para a altura = 0 e peso = 1, e para o botão altura = wrap_content e peso = 0.(definir ambos como wrap_content, como o usuário639183 disse, não limitariaListView
a altura de).fonte
ListView
altura deVocê provavelmente pode fazer isso funcionar usando contêineres aninhados. É possível que você precise envolver o botão em um segundo contêiner (interno) para que ele ocupe mais espaço e apenas alinhar o botão ao topo do contêiner interno.
Possível algo assim:
Esquema relativo
-- Exibição de lista
-- Esquema relativo
---- Botão
Usando as diferentes opções de alinhamento nos dois contêineres, você deve conseguir fazer isso funcionar.
fonte
android:layout_marginTop="30dip"
para o Botão, se quiser mais espaço entre a Lista e o Botão, por exemplo.Esta é a maneira mais limpa de fazer isso:
É semelhante à solução de Angelos, mas você não precisa do linearlayout que envolve o ListView. Você também pode usar um FrameLayout que é mais leve do que um LinearLayout para encerrar o Botão.
fonte
A ideia é delineada nas soluções muito boas por:
Ambos parecem funcionar perfeitamente pelo menos na v4.4.3.
Eu ainda tive que gastar algum tempo escrevendo o código de teste para verificar e confirmar cada método. Abaixo está o código de teste mínimo necessário e independente.
O layout é baseado na solução do Sparkle, pois contém menos layout aninhado. Também foi atualizado para refletir as verificações atuais do LINT.
Activity fornece o código padrão para testar a solução por si mesmo.
Sinta-se à vontade para adicionar ou melhorar, pois este é um "wiki da comunidade".
fonte
Tente usar o RelativeLayout com o botão na parte inferior. Defina a altura do layout como "wrap_content". Eu não tentei. Apenas ideia
fonte
no LinearLayout, basta adicionar
android:layout_weight="1"
a você ListViewfonte
A seguir está o que funcionou para mim ...
Nota: O params.width = ... Precisa ser definido também ...
O exemplo acima é quando você usa TableRow e ListView dentro de TableRow ...
fonte
envolver o conteúdo em layout linear
na visualização de lista, adicione: android: layout_weight = "1"
em seu botão definir altura fixa
fonte
Se você deseja que o conteúdo abaixo da visualização de lista desça conforme os elementos são adicionados à lista, tente esta solução:
Adicione preenchimento positivo na parte inferior da visualização de lista e preenchimento negativo na parte superior do "rodapé". Isso funcionará em um layout linear ou relativo.
fonte
Como não há atributo MaxHeight, sua melhor aposta é definir a altura do ListView para um valor definido ou usar
wrap_content
.fonte
Resolvi isso colocando o ListView dentro de um ScrollView. Lint não gostou, mas adicionando minHeight e definindo fillViewport como true, obtive um bom resultado.
fonte