获取视图尺寸的最佳实践,可能在它们被绘制到屏幕之前

时间:2013-07-31 18:50:35

标签: android view height width dimensions

我已经看到了很多不同的问题和答案,人们在检索视图的高度和宽度方面遇到了问题,尤其是this线程。

以下是检索视图尺寸的方法:

    您活动中的
  1. onWindowFocusChanged()
  2. 对您正在使用的视图类型进行子类化并覆盖onSizeChanged(),onLayout()或onMeasure()
  3. 使用ViewTreeObserver和addOnGlobalLayoutListener()
  4. 在某些情况下,它们中的每一个似乎都有效,而在其他情况下,人们说某些东西不能正常工作。由于View类没有setOnDimensionsKnown(OnDimensionsKnown odk)或类似的方法,这些方法中的哪一个(或者可能是未提及的方法)将给出我的视图最终将具有的维度,无论它是否已绘制,都具有wrap_content或fill_parent参数,或者它具有以px,dp或类似形式设置的显式高度和宽度?

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

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

    我可以发布代码以帮助解释更多示例。

1 个答案:

答案 0 :(得分:0)

这样做的好方法是在视图中添加OnGlobalLayoutListener(),如this answer中所述(问题中的第3点,我认为这对任何View最可靠) 。我为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().getMeasuredWitdh()即可获得号码。

你的问题可能早已过去,但希望其他人会偶然发现并发现它有用。 :)