Mam niestandardowy widok, który rysuje przewijalną mapę bitową na ekranie. Aby go zainicjować, muszę przekazać rozmiar w pikselach nadrzędnego obiektu układu. Ale podczas funkcji onCreate i onResume układ nie został jeszcze narysowany, a więc layout.getMeasuredHeight () zwraca 0.
Aby obejść ten problem, dodałem moduł obsługi, który czeka jedną sekundę, a następnie mierzy. To działa, ale jest niechlujne i nie mam pojęcia, ile mogę skrócić czas, zanim skończę, zanim zostanie narysowany układ.
Chcę wiedzieć, jak mogę wykryć rysowanie układu? Czy jest zdarzenie lub oddzwonienie?
źródło
view.post(Runnable)
, to czystsze i robi to samo.Naprawdę prosty sposób to po prostu sprawdzić
post()
swój układ. Spowoduje to uruchomienie kodu w następnym kroku, po utworzeniu widoku.źródło
Aby uniknąć przestarzałego kodu i ostrzeżeń, możesz użyć:
źródło
Lepiej dzięki funkcjom rozszerzenia Kotlin
źródło
Inna odpowiedź to:
spróbuj sprawdzić wymiary w
onWindowFocusChanged
.źródło
Alternatywą dla zwykłych metod jest zaczepienie się w rysunku widoku.
OnPreDrawListener
jest wywoływana wiele razy podczas wyświetlania widoku, więc nie ma określonej iteracji, w której widok ma prawidłową zmierzoną szerokość lub wysokość. Wymaga to ciągłego sprawdzania (view.getMeasuredWidth() <= 0
) lub ustawiania limitu liczby sprawdzeń na wartośćmeasuredWidth
większą niż zero.Istnieje również szansa, że widok nigdy nie zostanie narysowany, co może wskazywać na inne problemy z kodem.
źródło
How can you tell when a layout has been drawn?
a ty dostarczenie sposobu, w którym wybrany numerOnPreDrawListener
idon't stop interrogating that view until it has provided you with a reasonable answer
tak sprzeciw wobec rozwiązania powinny być oczywiste.Po prostu sprawdź to, wywołując metodę postu na swoim układzie lub widoku
źródło
post
po prostu ustawia kolejkę, po której można uruchomić, nie zapewnia pomiaru widoku, a nawet mniej rysowania.Po
onMeasure
wywołaniu widok otrzymuje zmierzoną szerokość / wysokość. Następnie możesz zadzwonićlayout.getMeasuredHeight()
.źródło