Чтение размера макета при запуске приложения


Мне нужно получить высоту ScrollView, определенную в файле xml макета во время запуска действия. Что является лучшей практикой для реализации этого. Я пробовал поместить код внутрь onCreate(), onStart() и onResume(). Все дает высоту как 0 при запуске. Существуют ли такие методы, как onFinishInflate() для действий?

Вот мой код:

myScroll=(ScrollView) findViewById(R.id.ScrollView01);
int height=myScroll.getHeight();
2 5

2 ответа:

Вы можете сделать что-то вроде этого:

Получите окончательную ссылку на ScrollView (для доступа в методе onGlobalLayout ()). Далее, Получить ViewTreeObserver из ScrollView, и добавить OnGlobalLayoutListener, переопределяя onGLobalLayout и получить измерения в этом прослушивателе.

final ScrollView myScroll = (ScrollView)findViewById(R.id.my_scroll);
ViewTreeObserver vto = myScroll.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        LayerDrawable ld = (LayerDrawable)myScroll.getBackground();
        height = myScroll.getHeight();
        width=myScroll.getHeight();
        ViewTreeObserver obs = myScroll.getViewTreeObserver();
        obs.removeOnGlobalLayoutListener(this);
    }

});

Смотрите больше в этой теме:

Как получить размеры вида?

Вам нужно запросить границы представления после того, как макет был выполнен. Предлагаемое место - onWindowFocusChanged(boolean). Смотрите этот вопрос для получения дополнительной информации: Как получить абсолютные координаты вида

Также, если вы решитесь расширить свой класс компоновки, например, создайте подкласс LinearLayout и т. д., вы можете переопределить функцию onLayout () следующим образом:

@Override
public void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    myScroll=(ScrollView) findViewById(R.id.ScrollView01);
    int height=myScroll.getHeight();
}