【问题标题】:getMeasuredWidth returns totally wrong valuegetMeasuredWidth 返回完全错误的值
【发布时间】:2014-01-02 09:41:25
【问题描述】:

我必须测量一个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 屏蔽,但没有任何帮助。

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

【问题讨论】:

  • 这将有助于了解您的视图组中的内容(提供 xml)。我刚刚遇到了同样的问题并解决了它,我认为你的没有什么不同,但让我们看看你的布局。 // 您不必屏蔽 getMeasured*() 返回的内容,这些值已经被屏蔽了。
  • 没有xml。 ViewGroup 的子项是动态实例化和添加的。
  • 在下面查看我的答案

标签: android android-layout view measure


【解决方案1】:

WRAP_CONTENT 而不是实际值传递给 makeMeasureSpec() 不会有任何好处,我不认为它们应该一起使用。

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

MeasureSpec.EXACTLY 将使其使用规范值,MeasureSpec.UNSPECIFIED 将使其使用视图的期望值。因此,如果您没有任何约束(例如,如果您将视图放入 ScrollView),您的选项是 MeasureSpec.UNSPECIFIED - 并且任何值作为第一个参数。

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

话虽如此,请尝试:

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() 的调用堆栈中有一些东西可以做到这一点:) 我想知道这是否是一个错误。也许它应该检查参数是否为否定并抛出异常或其他东西。

【讨论】:

  • 您应该得到的不仅仅是一个赞成票。23 小时内您将获得赏金。非常感谢您的精彩解释。 4 个小时以来,我一直在摸不着头脑。
  • @d3m0li5h3r 谢谢,很高兴我的回答对你有很大帮助)
  • 很好的解释。当人们以这种方式开发答案时,真的很喜欢它。使其易于理解并根据我的需要进行调整。非常感谢!
  • 先生,通过这篇文章,您获得了进入瓦尔哈拉的资格。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2019-06-21
  • 2013-06-14
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多