У меня есть собственное представление, которое рисует прокручиваемое растровое изображение на экране. Чтобы инициализировать его, мне нужно передать размер в пикселях родительского объекта макета. Но во время функций onCreate и onResume макет еще не прорисован, и поэтому layout.getMeasuredHeight () возвращает 0.
В качестве обходного пути я добавил обработчик, чтобы подождать одну секунду, а затем измерить. Это работает, но неаккуратно, и я понятия не имею, насколько я могу урезать время до того, как я закончу до того, как будет нарисован макет.
Я хочу знать, как я могу определить, когда макет нарисован? Есть ли событие или обратный звонок?
источник
view.post(Runnable)
, он чище и делает то же самое.Действительно простой способ - просто вызвать
post()
ваш макет. Это запустит ваш код на следующем шаге, после того как ваше представление уже будет создано.источник
Чтобы избежать устаревшего кода и предупреждений, вы можете использовать:
источник
Лучше с функциями расширения kotlin
источник
Другой ответ:
попробуйте проверить размеры просмотра в
onWindowFocusChanged
.источник
Альтернативой обычным методам является подключение к чертежу вида.
OnPreDrawListener
вызывается многократно при отображении вида, поэтому не существует конкретной итерации, в которой ваш вид имеет правильную измеренную ширину или высоту. Это требует, чтобы вы постоянно проверяли (view.getMeasuredWidth() <= 0
) или устанавливали ограничение на количество проверок,measuredWidth
превышающее ноль.Существует также вероятность того, что представление никогда не будет отображено, что может указывать на другие проблемы с вашим кодом.
источник
How can you tell when a layout has been drawn?
и вы предоставляете метод, по которому вы вызываете метод,OnPreDrawListener
иdon't stop interrogating that view until it has provided you with a reasonable answer
поэтому возражения против вашего решения должны быть очевидны.Просто проверьте это, вызвав метод post на вашем макете или представлении
источник
post
просто поставит в очередь исполняемый файл для запуска после, это не гарантирует, что представление будет измерено, даже менее нарисовано.Когда
onMeasure
вызывается, вид получает свою измеренную ширину / высоту. После этого вы можете позвонитьlayout.getMeasuredHeight()
.источник