As visualizações têm um,minHeight
mas de alguma forma estão faltando um maxHeight
:
O que estou tentando conseguir é ter alguns itens (visualizações) preenchendo a ScrollView
. Quando houver 1..3 itens, quero exibi-los diretamente. Ou seja, ScrollView
tem a altura de 1, 2 ou 3 itens.
Quando houver 4 ou mais itens, quero ScrollView
que pare de expandir (portanto, a maxHeight
) e comece a fornecer rolagem.
No entanto, infelizmente não há como definir a maxHeight
. Portanto, eu provavelmente tenho que definir minha ScrollView
altura programaticamente para WRAP_CONTENT
quando houver 1..3 itens e definir a altura para 3*sizeOf(View)
quando houver 4 ou mais itens.
Alguém pode explicar por que não há maxHeight
fornecido, quando já existe um minHeight
?
(BTW: alguns pontos de vista, como ImageView
ter uma maxHeight
implementado.)
fonte
Respostas:
Nenhuma dessas soluções funcionou para o que eu precisava: um ScrollView definido como wrap_content, mas com um maxHeight, para que ele parasse de se expandir após um determinado ponto e iniciasse a rolagem. Eu simplesmente substituí o método onMeasure no ScrollView.
Isso pode não funcionar em todas as situações, mas certamente me fornece os resultados necessários para o meu layout. E também aborda o comentário de madhu.
fonte
Para criar um
ScrollView
ouListView
com um maxHeight, você só precisa criar um LinearLayout transparente ao redor dele, com uma altura do que você deseja que o maxHeight seja. Você então define a Altura do ScrollView comowrap_content
. Isso cria um ScrollView que parece crescer até que sua altura seja igual ao LinearLayout pai.fonte
Isso funcionou para mim para torná-lo personalizável em xml:
MaxHeightScrollView.java:
attr.xml
layout de exemplo
fonte
(Eu sei que isso não responde diretamente à pergunta, mas pode ser útil para outras pessoas que procuram a funcionalidade maxHeight)
O ConstraintLayout oferece altura máxima para seus filhos via
ou
Exemplo de uso aqui .
fonte
Eu teria comentado a resposta da whizzle se pudesse, mas achei útil observar que, para resolver esse problema no contexto do modo de várias janelas no Android N, precisava alterar um pouco o código para isso:
Isso permite que o redimensionamento do layout seja menor que a altura máxima, mas também impede que ele seja maior que a altura máxima. Eu usei esta é uma classe de layout que Substitui
RelativeLayout
e isso me permitiu criar uma caixa de diálogo personalizada com umScrollView
filhoMaxHeightRelativeLayout
que não expande toda a altura da tela e também diminui para caber no menor tamanho de viúva em várias janelas para Android N.fonte
Não há como definir maxHeight. Mas você pode definir a altura.
Para fazer isso, você precisará descobrir a altura de cada item do scrollView. Depois disso, basta definir sua altura scrollView como numberOfItens * heightOfItem.
Para descobrir a altura de um item, faça o seguinte:
Para definir a altura, faça o seguinte:
fonte
Envolva seu
ScrollView
em torno de sua uma planícieLinearLayout
com layout_height = "max_height", isso vai fazer um trabalho perfeito. Na verdade, eu tenho esse código em produção nos últimos 5 anos, com zero problemas.fonte
Minha
MaxHeightScrollView
visualização personalizadastyle.xml
Usando
fonte
Eu tenho uma resposta aqui:
https://stackoverflow.com/a/29178364/1148784
Basta criar uma nova classe estendendo o ScrollView e substituir seu
onMeasure
método.fonte
Como mencionado acima, o ConstraintLayout oferece altura máxima para seus filhos via:
Além disso, se a altura máxima para um filho de um ConstraintLayout for incerta até a execução do aplicativo, ainda há uma maneira de fazer com que esse filho adapte automaticamente uma altura mutável, independentemente de onde foi colocada na cadeia vertical.
Por exemplo, precisamos mostrar uma caixa de diálogo inferior com um cabeçalho mutável TextView, um ScrollView mutável e um rodapé mutável TextView. A altura máxima da caixa de diálogo é 320dp , quando a altura total não atinge 320dp, o ScrollView atua como wrap_content, quando a altura total excede o ScrollView, atua como "maxHeight = 320dp - altura do cabeçalho - altura do rodapé".
Podemos conseguir isso apenas através do arquivo de layout xml:
A maioria dos códigos de importação é curta:
O uso horizontal de maxWidth é o mesmo.
fonte
Você já tentou usar o valor layout_weight ? Se você defini-lo como um valor maior que 0, ele expandirá essa visualização para o espaço restante disponível.
Se você teve várias visualizações que precisavam ser ampliadas, o valor se tornará um peso entre elas.
Portanto, se você tivesse duas visualizações definidas para um valor de layout_weight de 1, elas esticariam para preencher o espaço, mas estenderiam para uma quantidade igual de espaço. Se você definir um deles com o valor 2, ele aumentará duas vezes mais que a outra visualização.
Mais algumas informações aqui listadas em Layout linear.
fonte
maxHeight
que eu possa definir para um valor de mergulho específico. (I finalmente terminou para calcular e ajustar as alturas de programação)Eu acho que você pode definir a altura em tempo de execução para 1 item apenas
scrollView.setHeight(200px)
, para 2 itensscrollView.setheight(400px)
para 3 ou maisscrollView.setHeight(600px)
fonte
Como sabemos, os dispositivos com Android podem ter diferentes tamanhos de tela. Conforme sabemos, as visualizações devem se ajustar dinamicamente e se tornar o espaço apropriado.
Se você definir uma altura máxima, talvez force a vista a não ter espaço suficiente ou ocupar menos espaço. Eu sei que, às vezes, parece praticamente definir uma altura máxima. Mas se a resolução mudar drasticamente e mudar !, a exibição, que tem uma altura máxima, parecerá inadequada.
Eu acho que não há maneira adequada de fazer exatamente o layout que você deseja. eu recomendo que você pense sobre seu layout usando gerenciadores de layout e mecanismos relativos. Não sei o que você está tentando alcançar, mas me parece um pouco estranho que uma lista mostre apenas três itens e o usuário precise rolar a tela.
btw. minHeight não é garantido (e talvez também não deva existir). pode ter algum benefício em forçar a visibilidade dos itens, enquanto outros itens relativos ficam menores.
fonte
Se alguém estiver pensando em usar o valor exato para LayoutParams, por exemplo,
Lembre-se de levar em consideração a densidade da tela do dispositivo, caso contrário, poderá ocorrer um comportamento muito estranho em diferentes dispositivos. Por exemplo:
fonte
Primeiro obtenha a altura do item em pixels
então simplesmente
fonte
se vocês quiserem criar uma visualização de rolagem ou de lista sem transbordamento, mas em um RelativeLayout com uma visualização superior e inferior na parte superior e inferior:
fonte
Eu usei um ScrollView personalizado feito no Kotlin que usa
maxHeight
. Exemplo de uso:Aqui está o código de
ScrollViewWidthMaxHeight
:que também precisa desta declaração em
values/attrs.xml
:fonte