Если вы хотите получить ширину и высоту до того, как ваша активность добавит их в свою иерархию представления, измерить и выложить их, вам придется самостоятельно вызвать 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()
снова.