Intereting Posts
getAssets (); Из другого класса Android – Как проверить доступ в Интернет, а не только подключение к Wi-Fi? Панель действий Android, не отображающая переполнение Настройки разработчика Android 4.2 по-прежнему недоступны Как создавать приложения в android, которые нельзя удалить? Можем ли мы сделать системные приложения? Неоднозначное поведение нового символа линии Android – запрет TalkBack анонсировать заголовок TextView вслух Запуск приложения на нескольких устройствах автоматически в Android Studio Как согласовать или объединить два или более видеофайлов в Android? Scala + Android: Кто-нибудь успешно создает и отлаживает Eclipse? Android включает и выключает Wi-Fi HotSpot программно Как некоторые приложения (wechat) игнорируют поддельное местоположение, а затем обнаруживают реальный? Android Wear Пользовательские голосовые действия Как вы сокращаете пространство между плавающей подсказкой editText и окном editText в Android? Android Intent для потока HTTP MP3 на HTC Incredible

Как получить размер виджета 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 (Итак, я пришел к выводу, что использование задержки не гарантирует, что получение высоты произойдет после того, как изображение будет обработано.)

Solutions Collecting From Web of "Как получить размер виджета Android после раскладки?"

Причина, по которой вы получаете размер 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 }