Vistas dentro de um ViewGroup personalizado que não são renderizadas após uma alteração de tamanho

Estou com um problema que me deixou perplexo e esperava que alguém pudesse me dar algumas dica

Estou trabalhando em um aplicativo que usa um ViewGroup personalizado (na verdade, um FrameLayout que contém um RelativeLayout) para renderizar um calendário de eventos. Os eventos dentro do calendário são representados como visualizações dimensionadas de acordo com a duração do evento e o tamanho da visualização que os conté

Estou com um problema que ocorre quando o FrameLayout que contém é redimensionado. A implementação atual remove todas as visualizações que representam os eventos e tenta adicionar novas e calcular seus tamanhos com base no tamanho atual do FrameLayout. Este trabalho está sendo disparado pelo método onSizeChanged () de View, que é substituído no FrameLayout.

Quando a exibição é redimensionada, esse código é executado e as exibições são atualizadas, no entanto, nenhuma delas é renderizada na tela ... as exibições contidas no FrameLayout simplesmente não são visíveis. Se eu carregar a visualização na ferramenta hierarchyviewer, eles farão parte da árvore da visualização e serão descritos na visão geral nas posições em que devem estar, mas não serão exibidos. (Observe que as visualizações são visíveis na renderização inicial do FrameLayout ... é somente após um redimensionamento que elas desaparecem.)

Parece que a ordem dos eventos durante o redimensionamento é a seguinte:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()

Calling requestLayout () depois de redefinir as visualizações (dentro de onSizeChanged ()) parece não ter efeito. No entanto, se eu causar algum atraso antes de chamar requestLayout (), as visualizações se tornarão visíveis. Eu posso causar esse atraso gerando um encadeamento e adormecido, ou criando um botão fictício que simplesmente chama requestLayout () e pressionando-o após o redimensionamento, ou mesmo esse truque feio colocado no final de onSizeChanged ():

post(new Runnable() {
    public void run() {
        requestLayout();
    }
});

Quando uso esse hack, as visualizações contidas ficam visíveis e a ordem dos eventos é a seguinte:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()
onMeasure()
onMeasure()
onLayout()

Parece que forçar uma segunda passagem de medida (após a modificação da árvore de visualizações) torna as visualizações contidas visíveis como deveriam. Por que atrasar a chamada para requestLayout () é um mistério para mim.

Alguém pode fornecer alguma indicação sobre o que estou fazendo de errad

Sei que isso é um pouco difícil de seguir sem olhar para algum código, então criei um pequeno aplicativo de amostra que exibe meu problema e o disponibilizei no Github:

https: //github.com/MichaelSims/ViewGroupResizeTes

O hack que eu mencionei acima está comprometido com um ramo separado:

https: //github.com/MichaelSims/ViewGroupResizeTest/tree/post-runnable-hac

Se eu puder fornecer informações adicionais, informe-me e agradeço antecipadamente.

questionAnswers(2)

yourAnswerToTheQuestion