Eu tenho uma exibição personalizada que desenha um bitmap rolável na tela. Para inicializá-lo, preciso passar o tamanho em pixels do objeto de layout pai. Porém, durante as funções onCreate e onResume, o Layout ainda não foi desenhado e, portanto, layout.getMeasuredHeight () retorna 0.
Como solução alternativa, adicionei um manipulador para aguardar um segundo e depois medir. Isso funciona, mas é desleixado, e não tenho idéia de quanto posso cortar o tempo antes de terminar antes que o layout seja desenhado.
O que eu quero saber é: como posso detectar quando um layout é desenhado? Existe um evento ou retorno de chamada?
fonte
view.post(Runnable)
, é mais limpo e faz a mesma coisa.Uma maneira realmente fácil é simplesmente chamar
post()
seu layout. Isso executará seu código na próxima etapa, depois que sua visualização já tiver sido criada.fonte
Para evitar códigos e avisos obsoletos, você pode usar:
fonte
Melhor com as funções de extensão kotlin
fonte
Outra resposta é:
Tente verificar as dimensões da visualização em
onWindowFocusChanged
.fonte
Uma alternativa aos métodos usuais é se conectar ao desenho da vista.
OnPreDrawListener
é chamado várias vezes ao exibir uma vista, portanto, não há iteração específica em que sua vista tenha largura ou altura medidas válidas. Isso requer que você verifique continuamente (view.getMeasuredWidth() <= 0
) ou defina um limite para o número de vezes que você verifica se émeasuredWidth
maior que zero.Também existe a chance de a visualização nunca ser desenhada, o que pode indicar outros problemas com o seu código.
fonte
How can you tell when a layout has been drawn?
você está fornecendo um método no qual chama umOnPreDrawListener
e,don't stop interrogating that view until it has provided you with a reasonable answer
portanto, as objeções à sua solução devem ser óbvias.Basta verificar chamando o método de postagem em seu layout ou visualizar
fonte
post
apenas enfileirará o executável para executar depois, não garante que a vista seja medida, ainda menos desenhada.Quando
onMeasure
é chamado, a visualização obtém sua largura / altura medidas. Depois disso, você pode ligarlayout.getMeasuredHeight()
.fonte