Когда мы узнаем, когда были видны представления Activity

У меня есть Activity с иерархией вида следующим образом:

<RelativeLayout> <LinearLayout> <GridLayout /> </LinearLayout> </RelativeLayout> 

Верхняя RelativeLayout занимает полный экран, в то время как LinearLayout занимает подмножество экрана. Я пытаюсь установить размер представлений детей GridLayout таким образом, что с n строками и m столбцами размер ячеек напрямую связан с значениями n, m, а также шириной и высотой LinearLayout.

Так, например, я пытаюсь получить ширину и высоту ячейки следующим образом:

 int linearLayoutWidth = mLinearLayout.getMeasuredWidth(); int linearLayoutHeight = mLinearLayout.getMeasuredHeight(); ... int rows = mGridModel.getRows() + 1; int columns = mGridModel.getColumns() + 1; int cellWidth = (int) (linearLayoutWidth / columns); int cellHeight = (int) (linearLayoutHeight / rows); 

К сожалению, mlinearLayout.getMeasuredWidth () не возвращает правильный размер при создании представления. Он всегда возвращает ширину экрана фактического устройства до тех пор, пока представления не будут полностью выложены, и в этом случае это слишком поздно. Я уже дал моим ячейкам ячейки размеры, основанные на первоначально полностью неправильных значениях.

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

SetContentView () создает представления и теоретически излагает их. Но они не гарантированно находятся в их окончательных правильных местоположениях / размерах.

Вы можете добавить ViewObserver в любое представление, в этом наблюдателе существует метод обратного вызова onGlobalLayout, вызывается при компоновке Layout;

 ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //in here, place the code that requires you to know the dimensions. //this will be called as the layout is finished, prior to displaying. } } 

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

 public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener { @Override protected void onCreate(Bundle savedInstanceState) { ... view.getViewTreeObserver().addOnGlobalLayoutListener(this); } @Override public void onGlobalLayout() { ... } } 
Intereting Posts
Название центра Android ABS с кнопкой «домой» Как построить график в GraphView без фона? Можно ли программно изменить индикатор вкладки панели действий? WebView не изменяет размер Crosswalk crashes: используйте SharedXWalkView, если вы хотите поддерживать общий режим Доступ к файлам config.properties из AndroidManifest.xml Java.net.ConnectException: не удалось подключиться к /192.168.253.3 (порт 2468): соединение не выполнено: ECONNREFUSED (соединение отклонено) Android: определение типа безопасности беспроводных сетей в диапазоне (без подключения к ним) ПРЕДУПРЕЖДЕНИЕ: не указана цель, развертывание в эмуляторе Резервное копирование / восстановление общих настроек android Как отправить фотографию на Instagram с помощью моего приложения для Android? Как открыть клавиатуру Android «123» Не удается заставить плагин для привязки данных Android Можно ли взять скриншот и проверить значения пикселей с эспрессо? Маршрутизация аудио в Bluetooth-гарнитуру (не A2DP) на Android