2010-01-21 18 views
9

Muszę przygotować kilka obiektów w oparciu o początkowy układ widżetów i widoków w mojej Aktywności. Chciałbym to zrobić w krokach inicjowania, najlepiej w trybie Utwórz i uruchom. Biorąc pod uwagę możliwość zmian, które nastąpiły, gdy nie jesteśmy na pierwszym planie, niektóre z nich mogą się zdarzyć w trybie onResume.Kiedy robi się układ na Androida?

Sprawdziłem, czy mogę zmierzyć, w jaki sposób zostały przedstawione moje poglądy.

Log.d("MyApp", "w,h of X is " + findViewById(R.id.X).getWidth() + 
     "," + findViewById(R.id.X).getHeight()); 

Uruchomiłem to w sprawieCreate, onStart i onResume. Za każdym razem otrzymuję 0,0 dla szerokości, wysokości. Jeśli czekam na onTouchEvent, otrzymam informację o układzie, więc układ zostanie do tego czasu zakończony.

Jestem zaskoczony, że układ nie jest ustawiony i ostateczny do czasu, gdy widzę obiekt OnResume. Spodziewałem się, że widżety będą już gotowe i gotowe do tego, aby się z nimi bawić.

Odpowiedz

4

Układ jest wykonywany według potrzeb hierarchii widoków.

Po uruchomieniu aplikacji nastąpi to po upływie pewnego czasu od onResume() (w miarę jak okno jest wychowywane i umieszczane na ekranie).

Poprawny sposób, aby dowiedzieć się o operacji układ jest przez różne callbacków widok hierarchii - View.onSizeChanged() etc jak udokumentowano w sekcji „Układ” here:

+0

zrobiłem ślad stosu na metodzie onSizeChanged i nie pochodzi od pętla wysyłania wiadomości. – Brian

+1

Wygląda na to, że nie ma sposobu na ustawienie obsługi "onSizeChanged" bez podklasy, co jest niefortunne, ponieważ niektóre układy nie mają konstruktorów. Koniec z koniecznością wykonania wiele pracy za coś, co powinno być trywialne. –

+1

@dpk można użyć ViewTreeObserver, aby ustawić pakiet wywołań zwrotnych związanych z rysunkiem i układem, a tym samym uniknąć podklasy widoku. –

Powiązane problemy