Won*_*abo 26 android view measure android-layout
我必须测量一个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();
Run Code Online (Sandbox Code Playgroud)
这在Android 4.3仿真器上按预期工作.
然而,在三星Galaxy XCover 2(S7710)Android 4.1.2手机上返回的测量宽度是16777214 ...我尝试了一切,掩盖View.MEASURED_SIZE_MASK,但没有任何帮助.
你能提供一些帮助吗?提前致谢!
Iva*_*sov 60
传递WRAP_CONTENT而不是实际值makeMeasureSpec()将不会有任何好处,我不认为那些是为了一起使用.
使用实际约束值作为第一个参数(例如父视图的大小或屏幕的尺寸)和MeasureSpec.AT_MOST模式,这基本上是Math.min()- 参数是您在规范中放置的值和视图的所需维度.
MeasureSpec.EXACTLY将使其使用spec值,MeasureSpec.UNSPECIFIED将使其使用视图的所需值.因此,如果您没有任何约束(例如,如果您将视图放入a 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();
Run Code Online (Sandbox Code Playgroud)
PS关于16777214的有趣的事情,看看二进制数:https://www.google.ru/search?q = 16777214 + in + binary 它是-2(这是常数值LayoutParams.WRAP_CONTENT)但有8个最显着用逻辑操作截断的比特(因此没有减号),调用堆栈中有一些东西measure()可以做到这一点:)我想知道这是不是一个bug.也许它应该检查参数是否为负并抛出异常或其他东西.