Как вы можете определить, когда был составлен макет?

У меня есть пользовательский вид, который рисует прокручиваемое растровое изображение на экране. Чтобы инициализировать его, мне нужно передать размер в пикселях родительского объекта макета. Но во время функций onCreate и onResume макет еще не нарисован, и поэтому layout.getMeasuredHeight () возвращает 0.

В качестве обходного пути я добавил обработчик, чтобы подождать одну секунду, а затем измерить. Это работает, но его неряшливо, и я понятия не имею, насколько я могу урезать время до того, как я закончу до того, как макет нарисован.

Я хочу знать, как определить, когда макет нарисован? Есть ли событие или обратный вызов?

Solutions Collecting From Web of "Как вы можете определить, когда был составлен макет?"

Вы можете добавить древовидного наблюдателя в макет. Это должно возвращать правильную ширину и высоту. OnCreate вызывается до того, как будет выполнена макет детского просмотра. Таким образом, ширина и высота еще не вычислены. Чтобы получить высоту и ширину, поместите это в метод onCreate:

final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID); ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } }); 

Очень простой способ – просто вызвать post() на вашем макете. Это запустит ваш код следующим шагом после того, как ваше представление уже создано.

 YOUR_LAYOUT.post( new Runnable() { @Override public void run() { int width = YOUR_LAYOUT.getMeasuredWidth(); int height = YOUR_LAYOUT.getMeasuredHeight(); } }); 

Чтобы избежать устаревших кодов и предупреждений, вы можете использовать:

 view.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.getViewTreeObserver() .removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } yourFunctionHere(); } }); 

Другой ответ: попробуйте проверить размеры View на onWindowFocusChanged

Когда onMeasure называется, представление получает измеренную ширину / высоту. После этого вы можете вызвать layout.getMeasuredHeight ()