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

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

<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 является Тед расположения.)

11
задан Randy Sugianto 'Yuku' 19 May 2010 в 09:40
поделиться

1 ответ

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

11
ответ дан 3 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: