Como posso dimensionar uma visualização com base no tamanho de seu layout pai. Por exemplo, tenho um RelativeLayout
que preenche a tela inteira e quero que uma visualização secundária, digamos ImageView
, ocupe toda a altura e metade da largura.
Eu tentei substituir todos em onMeasure
, onLayout
, onSizeChanged
, etc e eu não poderia obtê-lo para o trabalho ....
Respostas:
Eu não sei se alguém ainda está lendo este tópico ou não, mas a solução de Jeff só vai te levar até a metade do caminho (meio que literalmente). O que seu onMeasure fará é exibir metade da imagem na metade do pai. O problema é que chamar super.onMeasure antes de
setMeasuredDimension
medirá todos os filhos na exibição com base no tamanho original, depois apenas cortará a exibição pela metade quando forsetMeasuredDimension
redimensionada.Em vez disso, você precisa chamar
setMeasuredDimension
(conforme necessário para uma substituição onMeasure) e fornecer um novoLayoutParams
para sua visualização e, em seguida , ligarsuper.onMeasure
. Lembre-se, vocêLayoutParams
é derivado do tipo-pai da sua visão, não do tipo da sua visão.Acredito que a única vez que você terá problemas com o pai
LayoutParams
é se ele for umAbsoluteLayout
(o que está obsoleto, mas às vezes é útil).fonte
MeasureSpec.getSize(widthMeasureSpec)
realmente dá a largura correta do pai? Para mim, ele apenas retorna larguras aleatórias que são muito próximas da largura real, mas não exatas.wrap_content
não o fará. A resposta de Vic não funciona para este cenário, mas o comentário de @M.Schenk sim. Ele também salva uma passagem de layout extra. Você também deve postar como uma resposta para visibilidade.super.onMeasure()
simplesmente substituir e anular os efeitos da chamada anterior parathis.setMeasuredDimension()
?super.onMeasure()
não substitui os cálculos anteriores.Você poderia resolver isso criando uma Visualização personalizada e substituindo o método onMeasure (). Se você sempre usar "fill_parent" para layout_width em seu xml, o parâmetro widthMeasureSpec que é passado para o método onMeasusre () deve conter a largura do pai.
Seu XML seria mais ou menos assim:
fonte
Descobri que é melhor não mexer em definir as dimensões medidas você mesmo. Na verdade, há um pouco de negociação acontecendo entre as visualizações pai e filho e você não quer reescrever todo o código .
O que você pode fazer, entretanto, é modificar as measureSpecs e, em seguida, chamar super com elas. Sua visualização nunca saberá que está recebendo uma mensagem modificada de seu pai e cuidará de tudo para você:
fonte
Ao definir um layout e visualização em XML, você pode especificar a largura e altura do layout de uma visualização para envolver o conteúdo ou preencher o pai. Ocupar metade da área é um pouco mais difícil, mas se você tivesse algo que quisesse na outra metade, poderia fazer algo como o seguinte.
Dar a duas coisas o mesmo peso significa que elas se esticarão para ocupar a mesma proporção da tela. Para obter mais informações sobre layouts, consulte os dev docs.
fonte
Eu acredito que a abordagem XML da Mayras pode vir bem. No entanto, é possível torná-lo mais preciso, com uma visualização apenas, definindo o weightSum. Eu não chamaria mais isso de hack, mas, em minha opinião, a abordagem mais direta:
Assim, você pode usar qualquer peso, 0,6 por exemplo (e centralização) é o peso que eu gosto de usar para botões.
fonte
Tente isto
então você pode usar LinearLayout.LayoutParams para definir os parâmetros do chileView
fonte
Agora você pode usar PercentRelativeLayout. Estrondo! Problema resolvido.
fonte
Roman, se você quiser fazer seu layout em código Java (descendente do ViewGroup), é possível. O truque é implementar os métodos onMeasure e onLayout. O onMeasure é chamado primeiro e você precisa "medir" a subvisualização (dimensionando-a efetivamente para o valor desejado) lá. Você precisa dimensioná-lo novamente na chamada onLayout. Se você não conseguir fazer essa sequência ou não chamar setMeasuredDimension () no final do código onMeasure, não obterá resultados. Por que isso é projetado de forma tão complicada e frágil está além de mim.
fonte
Se o outro lado estiver vazio. Eu acho que a maneira mais simples seria adicionar uma visualização vazia (por exemplo, um layout linear) e definir as larguras de ambas as visualizações como fill_parent e seus pesos como 1.
Isso funciona em um LinearLayout ...
fonte
É algo assim:
fonte
Venho lutando com essa questão há muito tempo, quero mudar a largura da gaveta do meu DrawerLayout, que é o segundo filho de seu pai. Recentemente descobri, mas não sei se existe uma ideia melhor.
fonte