我必须测量一个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
掩盖,但没有任何帮助。
你能提供一些帮助吗?提前谢谢!
答案 0 :(得分:58)
将WRAP_CONTENT
而不是实际值传递给makeMeasureSpec()
将无济于事,我认为这些不是为了一起使用。
使用实际约束值作为第一个参数(例如父视图的大小或屏幕尺寸)和MeasureSpec.AT_MOST
模式,基本上是Math.min()
- 参数是您放入的值规范和视图所需的尺寸。
MeasureSpec.EXACTLY
会使其使用规范值,MeasureSpec.UNSPECIFIED
会使其使用视图所需的值。因此,如果您没有任何约束(例如,如果将视图放入ScrollView
),则选项为MeasureSpec.UNSPECIFIED
- 并且任何值都作为第一个参数。
所以, {gurus,如果我错了,请纠正我} 除了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()
的调用堆栈中有一些东西可以做到这一点:)我想知道这是不是一个bug 。也许它应该检查论证是否为负面并抛出异常或其他东西。