Представления внутри настраиваемой группы просмотра не отображаются после изменения размера

I ' m столкнулся с проблемой, которая поставила меня в тупик, и я надеялся, что кто-то может дать мне несколько указателей.

Я работаю над приложением, которое использует настраиваемую ViewGroup (фактически FrameLayout, содержащую RelativeLayout) для визуализации календаря событий. События внутри календаря представлены в виде представлений, размер которых зависит от продолжительности события и размера содержащего представления.

Я столкнулся с проблемой, которая возникает при изменении размера содержащего FrameLayout. Текущая реализация удаляет все представления, которые представляют события, и пытается добавить новые и вычислить их размеры на основе текущего размера FrameLayout. Эта работа запускается с помощью метода onSizeChanged () View, который переопределяется в FrameLayout.

Когда размер представления изменяется, этот код выполняется, и представления обновляются, однако ни один из них на самом деле не отображается на экране ... представления, содержащиеся в FrameLayout, просто не видны. Если я загружаю представление в инструмент просмотра иерархии, они становятся частью дерева представлений и выделяются в обзоре в тех позициях, в которых они должны находиться, но не отображаются. (Обратите внимание, что представления видны при начальном рендеринге FrameLayout ... они исчезают только после изменения размера.)

Похоже, что порядок событий во время изменения размера следующий:

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

Вызов requestLayout ( ) после сброса представлений (внутри onSizeChanged ()), похоже, не имеет никакого эффекта. Однако, если я вызываю некоторую задержку перед вызовом requestLayout (), представления становятся видимыми. Я могу вызвать эту задержку, создав поток и засыпая, или создав фиктивную кнопку, которая просто вызывает requestLayout () и нажимает ее после изменения размера самостоятельно, или даже этот уродливый хак, помещенный в конец onSizeChanged ():

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

Когда я использую этот хакерский хак, отображаются содержащиеся в нем представления, а порядок событий следующий:

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

Получается, что принудительный проход второго измерения (после того, как дерево представлений было изменено) делает содержащиеся представления видимыми, какими они должны быть. Почему задержка вызова requestLayout () делает это для меня загадкой.

Может ли кто-нибудь указать на то, что я делаю неправильно?

Я понимаю, что это довольно сложно понять, не глядя на код , поэтому я создал небольшой пример приложения, демонстрирующего мою проблему, и сделал его доступным на Github:

https://github.com/MichaelSims/ViewGroupResizeTest

Хак, о котором я упоминал выше, размещен в отдельной ветке:

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

Если я могу предоставить дополнительную информацию, пожалуйста, сообщите мне и заранее спасибо.

20
задан Michael Sims 2 May 2011 в 01:31
поделиться