@guliash & Artem Gilmudinov - #7
Conversation
| } | ||
|
|
||
| @Override | ||
| protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
There was a problem hiding this comment.
неправильно считается высота, если задать HorizontalLinearLayout wrap_parent, то некоторые вьюхи схлопнуться
There was a problem hiding this comment.
По поводу твоих замечаний.
Я сейчас задумался. Такой кейс. Пусть этот вью груп wrap_conent. В нём много вьюх с высотой match_parent, вьюха с шириной match_parent и высотой wrap_content, и много вьюх с высотой wrap_content и fixed(dp). Я не могу посчитать высоту вьюх match_parent пока не посчитаю высоты вьюх с fixed и wrap_content. В то же время я не могу посчитать ширину вьюхи с match_parent, пока не посчитаю ширину остальных вьюх. Получается, что я не могу посчитать суммарные размеры без замера какой-то вьюхи дважды. Но это же противоречит ТЗ(что measure надо делать в один проход)?
There was a problem hiding this comment.
Я не могу посчитать высоту вьюх match_parent пока не посчитаю высоты вьюх с fixed и wrap_content.
Высота уже есть в measureSpec, точнее ограничения по высоте.
Что-то я не очень понял как ты связал расчет высоты и ширины: они же не зависят друг от друга.
There was a problem hiding this comment.
Родитель контейнера почти наверняка передаст AT_MOST.
Чтобы посчитать ширину единственной вьюхи с шириной match_parent надо вычислить ширины всех остальных. Чтобы посчитать высоты всех вьюх с высотой match_parent надо посчитать высоты всех вьюх с wrap_content и fixed и выставить вьюхам с match_parent max от тех. Пусть у нас есть вьюха с шириной match_parent и высотой wrap_content (назовём её A). Вьюхи с высотой match_parent не могут посчитаться пока не посчитается высота A. С другой стороны ширина A не может посчитаться пока не посчитаются ширины всех остальных вьюх. Таким образом одно зависит от другого и что-то придётся посчитать дважды (например A, тогда станет известна её высота и мы можем выставить высоты вьюхам с высотой match_parent).
There was a problem hiding this comment.
А, понял про что ты, верно, но это нельзя считать один лишний meause это уже 2 прохода, 2 прохода это когда 2 цикла.
There was a problem hiding this comment.
Можно еще посмотреть, если интересно, как сделано во FrameLayout, там хранится список mMatchParentChildren в который добавляются все элементы с match_parent и в конце есть еще один проход по этому списке с выставлением правильно высоты/ширины. Тебе, конечно, так делать не надо. Просто у тебя при выставлении в wrap_content вьюхи совсем обрезались, так точно не должно быть)
There was a problem hiding this comment.
Да, так быть не должно. Ок, если можно заюзать лишний measure то easy. Сделаю.
There was a problem hiding this comment.
Сделано. В худшем случае нужно childCount + 1 measure детей.

Horizontal Linear Layout.