2010-01-21 2 views
9

Мне нужно подготовить некоторые объекты на основе исходного макета виджетов и представлений в моей деятельности. Я хотел бы сделать это на этапах инициализации, в идеале onCreate и onStart. Учитывая возможность изменений, которые происходят, когда мы не находимся на переднем плане, некоторые из них, возможно, должны произойти в onResume.Когда андроид сначала делает макет?

Итак, я проверил, могу ли я измерить, как мои взгляды были выложены.

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

Я запустил это в onCreate, onStart и onResume. Каждый раз, когда я получаю 0,0 для ширины, высоты. Если я буду ждать onTouchEvent, я получаю информацию о макете, поэтому макет будет выполнен к тому времени.

Я удивлен, что макет не установлен и окончателен к тому времени, когда я вижу onResume. Я ожидал, что виджеты будут уже выложены и готовы к тому, чтобы поиграть с ними.

ответ

4

Макет выполняется по иерархии вида по мере необходимости.

Когда ваше приложение запускается, это будет через некоторое время после onResume() (так как ваше окно поднимается и помещается на экран).

Правильный способ узнать об операциях макета через различные функции обратного вызова вид иерархии - View.onSizeChanged() и т.д. как описано в разделе «Макет» here:

+0

Я сделал трассировку стека на onSizeChanged метод, и он приходит от цикл отправки сообщений. – Brian

+1

Невозможно установить обработчик onSizeChanged без подкласса, что является неудачным, поскольку некоторые макеты не имеют конструкторов. Вы в конечном итоге должны много работать для чего-то, что должно быть тривиально. – 2010-12-19 18:04:05

+1

@dpk вы можете использовать ViewTreeObserver для установки связки обратного вызова, связанной с чертежом и компоновкой, и, таким образом, избегать подкласса представления. –

Смежные вопросы