Простой вопрос, возможно, удручающе сложный, но, надеюсь, простой ответ?
Какова «лучшая практика» для получения фактической высоты элемента, для которого установлен размер FILL_PARENT?
Простой вопрос, возможно, удручающе сложный, но, надеюсь, простой ответ?
Какова «лучшая практика» для получения фактической высоты элемента, для которого установлен размер FILL_PARENT?
Определенно сложнее, чем кажется. Более простой способ, который я нашел по сравнению с ответом на предложенный вопрос, - использовать ViewTreeObserver. В вашем методе onCreate() вы можете использовать следующий код:
TextView textView = (TextView)findViewById(R.id.my_textview);
ViewTreeObserver observer = textView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.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.
}
});
Просто дополнительная поправка к приведенному выше ответу, если вам нужно выполнить какие-либо операции с размерами нескольких компонентов в представлении. Слушатель компоновки вызывается для каждого представления по мере завершения компоновки. Это рекурсивно верно для корневого компонента представления (т. е. дочерние элементы генерируют события макета, затем родительский элемент генерирует свое событие макета). Это означает, что вы можете просто подключиться к событию макета корневого компонента представления, чтобы получать уведомления при изменении макета любого представления.
ViewTreeObserver observer = this.findViewById(android.R.id.content).getViewTreeObserver();
Теперь вы можете ожидать, что все ваши представления будут иметь значения ширины и высоты, установленные в onGlobalLayout, потому что все они выполнили свой макет. Это, очевидно, предпочтительнее, чем создавать множество прослушивателей для каждого представления, которое должно отображать свои фактические размеры (если, конечно, вам абсолютно не нужна область действия, для которой представление сгенерировало событие, что обычно не требуется).