Чтение размера макета при запуске приложения
Мне нужно получить высоту ScrollView
, определенную в файле xml макета во время запуска действия. Что является лучшей практикой для реализации этого. Я пробовал поместить код внутрь onCreate()
, onStart()
и onResume()
. Все дает высоту как 0 при запуске.
Существуют ли такие методы, как onFinishInflate()
для действий?
Вот мой код:
myScroll=(ScrollView) findViewById(R.id.ScrollView01);
int height=myScroll.getHeight();
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(); }