Intereting Posts
Как отключить автозаполнение и автоматическую корректировку EditText Выберите тип клавиатуры ввода для QLineEdit Устанавливать векторный Drawable в ImageView вызывает сбой приложения в старом SDK SurfaceView в макете Проблемы с импортом SDK MoPub с помощью Phonegap Как определить, на какой платформе работает текущее приложение в LibGDX? Правильный способ получить объект Realm по его первичному ключу в Android Java HtmlUnit на Android: Зависимости Можно ли скрыть конкретное приложение от пользователя? Удалите все неиспользуемые ресурсы из проекта Android Общие элементы, анимация между фрагментами В модуле BillingService необходимо изменить параметры для повышения безопасности? Как сгенерировать buildConfigField со строковым типом Измените синий цвет по умолчанию в теме головоломки Android на оранжевый (или что-нибудь еще) Как определить, имеет ли пользователь 3G / Wifi, прежде чем устанавливать соединение с URL?

Как получить размер виджета Android после раскладки?

У меня есть макет, который определяет размеры виджетов в относительном измерении, например:

<LinearLayout ... layout_height="fill_parent"> <ImageView ... layout_height="wrap_content" /> <TextView ... layout_height="120dp" /> </LinearLayout> 

Сразу после onCreate , я хочу знать, насколько onCreate ImageView. Как это сделать?

Примечание. Если я вызову getHeight() в onCreate , я получаю 0.

Я также пробовал imageView.postDelayed , он работает на эмуляторе 2.1, но не работает на эмуляторе 1.5 (у меня тоже 0).

Наконец, я попытался создать Handler , а затем я вызываю handler.postDelayed с задержкой 10 мс. Он работает как в эмуляторе 2.1, так и 1.5, но не удался, когда я запускаю программу в отладчике eclipse (Итак, я пришел к выводу, что использование задержки не гарантирует, что получение высоты произойдет после того, как изображение будет обработано.)

Причина, по которой вы получаете размер 0, заключается в том, что макет не завершен до тех пор, пока действие полностью не будет создано, т.е. onCreate (), onStart () и onResume () все прошли. Самый простой способ получить точный размер – вызвать метод после завершения макета, например, с помощью кнопки прослушивания нажатием кнопки. Поскольку кнопка не отображается, пока макет не будет закончен, размер должен быть доступен к тому моменту, когда его прослушиватель кликов будет запущен.

Это только предположение, но я думаю, что это трудно сделать именно потому, что они не хотят, чтобы люди возились с размерами макета, как только система только что закончила выкладывать экран. Если они предоставили обратный вызов onLayoutFinished (), то вы могли бы застрять в цикле, если вы изменили макет в этом. Например, представьте: макет завершен; OnLayoutFinished (), и вы изменяете макет там; Существующий макет теперь недействителен; Макет переделан; OnLayoutFinished () снова вызван; Ваш код снова вызван – и так далее.

Другой способ сделать это – создать пользовательский вид и переопределить метод onMeasure(int, int) . Система запускает этот метод для получения размера каждого представления; Если вы используете что-то вроде моего примера ниже, вы можете получить предлагаемый размер до завершения макета:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, heightMeasureSpec); //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size } 

(Я написал, что это рекомендуемый размер, потому что я думаю, что размер файла может быть изменен после этого на основе ограничений макета. Однако это неопределенная память о чем-то, что я прочитал некоторое время назад, и я никогда не экспериментировал подробно.) Как только вы «Вы сделали это, вы можете использовать размер для того, что вы хотели сделать – вы даже можете изменить размер, который он будет использовать, используя setMeasuredDimension(newX, newY) .

Объект View предоставляет метод, называемый onSizeChanged (int w, int h, int oldw, int oldh). Он вызывается, когда макет изменяет размер одного из его компонентов. Если вы переопределите этот метод, то код в вашей версии этого метода будет знать размер самого себя, как показано в следующем фрагменте.

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { bounds = new Rect(); this.getDrawingRect(bounds); // bounds will now contain none zero values }