Как можно узнать высоту Laoyut?

Рейтинг: 4Ответов: 1Опубликовано: 06.01.2015

Я сам назначаю ему высоту по контенту, но я хочу узнать его высоту в dp или пикселях, чтобы при смене контента оставить высоту таким же какой и был.

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams();
params.height = -2;
fr.setLayoutParams(params);

И еще вопрос: если я назначу

params.height = 100;

в чем это значение измеряется - в px или dp?

Ответы

▲ 3Принят

Приведённый вами в вопросе код спокойно вернёт в

params.height

высоту элемента.

Проблема может возникнуть, если она изначально

= "wrap_content" || "match_parent"; //вернёт -2 || -1, а не высоту в пикселях

Тогда вариантов несколько. Например можно получить координаты "верха" и "низа" элемента:

FrameLayout fr = //находим элемент
int topYcoord = fr.getTop();
int bottomYcoord = fr.getBottom();

И из них вычислить высоту элемента:

int calculatedHeight = bottomYcoord-topYcoord;

И применить к элементу:

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams();
params.height = calculatedHeight;
fr.setLayoutParams(params);

UPD 0:

Всё вышеописанное работает в onResume() активити, когда система подсчитала все координаты всех лэйаутов.

До onResume() можно, например так:

//int h = fr.getMeasuredHeight(); вернёт 0, т.к. не измерялось ещё.
//вроде как принудительно измеряет элемент
//"0" здесь - это какие-то константы. Что и как они конкретно делают - магия для меня
fr.measure(0,0);
//теперь высота измерена и вернет !0
int h = fr.getMeasuredHeight();

UPD 1:

Поэкспериментировал. Выводы:

  1. FrameLayout возвращает 0 всегда, если в нём нет детей.
  2. Если есть ребёнок, возвращает его высоту, даже если он (ребёнок) занимает его не полностью.
  3. С RelativeLayout всё работает.

Вывод: Пользуйте RelativeLayout.