У меня есть расположение, которое указывает размеры виджетов в относительном размере, например:
<LinearLayout ... layout_height="fill_parent">
<ImageView ... layout_height="wrap_content" />
<TextView ... layout_height="120dp" />
</LinearLayout>
Сразу после onCreate
, Я хочу знать, сколько высота ImageView. Как сделать это?
Примечание: Если я звоню getHeight()
в onCreate
, Я добираюсь 0.
Я также попробовал imageView.postDelayed
, это работает над 2,1 эмуляторами, но перестало работать на 1,5 эмуляторах (я добрался 0, также).
Наконец, я пытался создать a Handler
, и затем я звоню handler.postDelayed
с задержкой на 10 мс. Это работает и в 2,1 и в 1,5 эмуляторах, но отказавший, когда я запускаю программу в отладчике затмения (Так, я прихожу к заключению, что использование задержки не гарантирует, что получение высоты происходит после того, как imageview является Тед расположения.)
Причина, по которой вы получаете размер 0, заключается в том, что макет не завершен до тех пор, пока действие не будет полностью создано, т.е. onCreate (), onStart () и onResume () имеют все прошли. Самый простой способ получить точный размер, который я знаю, - это вызвать ваш метод после завершения макета, например, с помощью прослушивателя щелчков на кнопке. Поскольку кнопка не отображается, пока макет не будет завершен, размер должен быть доступен к моменту запуска ее прослушивателя щелчков.
Это только предположение, но я полагаю, что это сложно сделать именно потому, что они не хотят, чтобы люди возились с размерами макета после того, как система только что завершила разметку экрана. Если они предоставили обратный вызов onLayoutFinished (), вы могли бы застрять в цикле, если изменили макет в нем.Например, представьте: верстка завершена; onLayoutFinished () вызывается, и вы изменяете макет там; существующий макет теперь недействителен; верстка переделана; onLayoutFinished () вызывается снова; ваш код снова вызывается - и так далее.
Другой способ сделать это - создать собственный View и переопределить метод 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)
.