getMeasuredWidth返回完全错误的值

我必须测量一个View间隔其他人。 我使用这个代码:

 ViewGroup view = ...; view.setPadding(10, 0, 10, 0); int wrapContent = RelativeLayout.LayoutParams.WRAP_CONTENT; int specWidth = MeasureSpec.makeMeasureSpec(wrapContent, MeasureSpec.AT_MOST); view.measure(specWidth, specWidth); int questionWidth = view.getMeasuredWidth(); 

这在Android 4.3模拟器上按预期工作。

然而,三星Galaxy XCover 2(S7710)Android 4.1.2手机返回的测量宽度是16777214 …我尝试了一切,用View.MEASURED_SIZE_MASK屏蔽,但没有任何帮助。

你能提供一些帮助吗? 提前致谢!

Solutions Collecting From Web of "getMeasuredWidth返回完全错误的值"

WRAP_CONTENT而不是实际值传递给makeMeasureSpec()将不会有什么好处,我不认为这些是一起使用的。

使用实际约束值作为第一个参数(例如父视图的大小或屏幕的尺寸)与MeasureSpec.AT_MOST模式,基本上是Math.min() – 参数是放入spec中的值,视图所需的尺寸。

MeasureSpec.EXACTLY将使其使用规格值, MeasureSpec.UNSPECIFIED将使其使用视图的期望值。 所以,如果你没有任何约束(就像把你的视图放到一个ScrollView ),你的选项就是MeasureSpec.UNSPECIFIED – 任何值作为第一个参数。

所以, {大师,纠正我,如果我错了}你得到WRAP_CONTENT行为以外的任何模式MeasureSpec.EXACTLY

这就是说,尝试:

 ViewGroup view = ...; view.setPadding(10, 0, 10, 0); // Either this int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST); // Or this int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED); view.measure(specWidth, specWidth); int questionWidth = view.getMeasuredWidth(); 

PS有趣的事情关于16777214 ,看看在二进制数: https : //www.google.ru/search? q=16777214+ in+binary它是-2 (这是不变的LayoutParams.WRAP_CONTENT值),但与8个最重要的位被截断了一个逻辑运算(因此没有减号),有一些measure()调用堆栈这样做:)我不知道这是否是一个错误。 也许它应该检查参数是否定的,抛出exception或什么的。