измерение вида перед его отображением - PullRequest
54 голосов
/ 13 мая 2010

Мне нужно выяснить, насколько большим будет представление после присоединения его к родительскому элементу.

Я переопределил этот метод:

onMeasure(int, int);

но похоже, что этот метод вызывается только тогда, когда я фактически добавляю свой пользовательский вид в его контейнер, используя:

addView(myView);

Как вы думаете, есть ли способ получить эту информацию перед отображением самого представления? По сути, мне нужно знать действительный размер, прежде чем прикреплять его, и вообще не прикреплять вид, если это займет больше определенного пространства.

кто-нибудь?

Ответы [ 5 ]

84 голосов
/ 06 декабря 2011

Если вы хотите получить ширину и высоту до того, как ваша активность добавит их в свою иерархию представления, измерить и выложить их, вам придется самостоятельно вызвать measure() на View, прежде чем вызывать getMeasuredWidth() или * 1004. *.

Поскольку измеренная ширина и высота устанавливаются после вызова меры (что, в свою очередь, вызывает onMeasure()), они вернут 0 до этой точки. Вы должны будете предоставить MeasureSpec s до measure(..), которые будут варьироваться в зависимости от ваших потребностей.

MeasureSpecs, которые позволяют дочерним элементам самим устанавливать любые ограничения, выглядят как

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);

Важный момент . (был изменен в новом API) Ширина, переданная выше, может быть либо явной px, либо ViewGroup.LayoutParams.WRAP_CONTENT, либо ViewGroup.LayoutParams.FILL_PARENT.

Также стоит отметить, что когда ваше представление измеряется в фактической иерархии назначения, MeasureSpec, который будет передан в measure(), будет настроен на основе содержащей ViewGroups логики макета . Его можно вызывать более одного раза, если значения первой меры недопустимы, если рассматривать их в контексте этой родительской viewGroup / ее собственных ограничений макета / ограничений любых дочерних дочерних представлений. Не дожидаясь, пока viewGroup вызовет measure(), прежде чем реализовать какую-либо логику, зависящую от измеренного размера, было бы трудно (в зависимости от ситуации) получить окончательный measuredWidth & height из вышеприведенного решения, но во всех случаях, которые у меня есть Использованная выше методика вполне соответствовала цели, но они были относительно просты. Если вам действительно нужно измерять в контексте, вам, вероятно, следует просто сделать это после того, как onLayout() вернулось и явно установить любые изменения, затем requestLayout() снова.

7 голосов
/ 13 мая 2010

OnMeasure не сообщает вам размер View. Вместо этого он просит ваш пользовательский вид установить его размер, предоставив некоторые ограничения, применяемые родительским видом.

Это из документации SDK:

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

Вторая пара называется просто ширина и высота или иногда рисунок ширина и высота рисования. Эти Размеры определяют фактический размер вид на экране, во время рисования и после макета. Эти значения могут, но не надо, отличаться от измеренная ширина и высота. Ширина и высота могут быть получены с помощью Вызов getWidth () и getHeight ().

После разметки вы можете вызвать getWidth () и getHeight (), чтобы найти окончательный размер вашего пользовательского представления.

1 голос
/ 12 декабря 2018

первый звонок

 view.measure(0, 0);

тогда получите

view.getMeasuredWidth() или view.getMeasuredHeight()

0 голосов
/ 18 августа 2011

У меня такая же проблема.Я предполагаю, что единственный способ - это сделать сначала, а затем удалить его после , если он соответствует условию размераКажется немного странным, но Android, кажется, знает размеры только после рисования.

0 голосов
/ 13 мая 2010

Вы должны иметь возможность использовать getMesauredWith () и getMeasuredHeight ()

http://developer.android.com/reference/android/view/View.html#getMeasuredWidth%28%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...