Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Получить фактическую высоту обзора

Автор вопроса: Wonko the SaneОтветов: 2

Простой вопрос, возможно, удручающе сложный, но, надеюсь, простой ответ?

Какова "лучшая практика" для получения фактической высоты элемента, для которого установлен размер FILL_PARENT?

  • Вероятно, это дубликат этого вопроса SO: заголовок stackoverflow.com/questions/2864331/ Yoni Samlan 21.12.2010
  • Спасибо - мой поиск фу уже ушел на праздник. Я собираюсь сначала попробовать ответ ниже, но хорошо иметь варианты. Wonko the Sane 21.12.2010

androidandroid-layoutsize

Ответы

Ответ 1 · рейтинг 17 · Kevin Coppock

Определенно сложнее, чем кажется. Более простой способ, который я нашел по сравнению с ответом на предложенный вопрос, - использовать 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.
    }
});

Ответ 2 · рейтинг 2 · pjs

Просто дополнительная поправка к приведенному выше ответу, если вам нужно выполнить какие-либо операции с размерами нескольких компонентов в представлении. Слушатель компоновки вызывается для каждого представления по мере завершения компоновки. Это рекурсивно верно для корневого компонента представления (т. е. дочерние элементы генерируют события макета, затем родительский элемент генерирует свое событие макета). Это означает, что вы можете просто подключиться к событию макета корневого компонента представления, чтобы получать уведомления при изменении макета любого представления.

ViewTreeObserver observer = this.findViewById(android.R.id.content).getViewTreeObserver();

Теперь вы можете ожидать, что все ваши представления будут иметь значения ширины и высоты, установленные в onGlobalLayout, потому что все они выполнили свой макет. Это, очевидно, предпочтительнее, чем создавать множество прослушивателей для каждого представления, которое должно отображать свои фактические размеры (если, конечно, вам абсолютно не нужна область действия, для которой представление сгенерировало событие, что обычно не требуется).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы