2

对于人们在检索视图的高度和宽度时遇到的问题,我已经看到了大量不同的问题和答案,尤其是这个线程。

以下是检索视图维度的方法:

  1. onWindowFocusChanged() 在您的活动中
  2. 子类化您正在使用的视图类型并覆盖 onSizeChanged()、onLayout() 或 onMeasure()
  3. 使用 ViewTreeObserver 和 addOnGlobalLayoutListener()

它们中的每一个似乎在某些情况下都可以工作,而在其他情况下,人们会说某些东西不能正常工作。由于 View 类没有 setOnDimensionsKnown(OnDimensionsKnown odk) 或类似方法,这些方法中的哪一个(或可能未提及的方法)将为我提供我的视图最终将具有的尺寸,无论它是否已绘制,具有 wrap_content 或fill_parent 参数,或者它在 px、dp 或类似中设置了明确的高度和宽度?

编辑:也许一个具体的例子会有所帮助,我试图让 PopupWindow 包装它的内容,并在 -x 方向上偏移它的宽度值。问题是在我显示弹出窗口之后才测量内容宽度以及弹出窗口宽度。所以基本上我想不出一个好方法来测量它在被绘制到屏幕之前的宽度。

我通常的方法是在绘制之前覆盖我需要的任何视图类的尺寸,并创建我自己的 setOnDimensionsKnown(OnDimensionsKnown odk) 方法并使用调用 onMeasure 的宽度和高度值触发它。这适用于我需要的每种情况,但是覆盖每个视图类来执行此操作似乎并不优雅。

我可以发布代码来帮助更多地解释这个例子。

4

1 回答 1

0

这样做的好方法是OnGlobalLayoutListener()在视图中添加一个,如this answer中所述(我认为你的问题中的第 3 点对任何人来说都是最可靠的View)。我为 a 做的方式PopupWindow是膨胀它的布局,然后调用measure它:

popupView = getActivity().getLayoutInflater().inflate(R.layout.popup_layout, null);
popup = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
popupView.measure(view.getMeasuredWidth(), view.getMeasuredHeight()); //the view is parent's layout (not sure if those are correct values, but it measures okay in my case)

然后只需通过调用popupView.getMeasuredHeight()and来获取数字.getMeasuredWitdh()

您的问题现在可能早已不复存在,但希望其他人会偶然发现它并发现它有帮助。:)

于 2015-04-21T09:48:14.970 回答