如何获取或计算膨胀视图的宽度/高度

时间:2011-06-21 18:36:07

标签: android

如果父级是PopupWindow而不是ViewGroup,如何计算膨胀视图的宽度和高度?我不能使用LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean),因为PopupWindow不是ViewGroup,所以我使用LayoutInflator.inflate(int resId)代替,但之后我getWidth()和getHeight()返回零:(

我需要调整PopupWindow的大小以适应View,但是在View有父级之前不能这样做。我有鸡蛋问题吗?

顺便说一下,View是RelativeView的子类,因此手动计算它基本上是不可能的。

提前致谢, 百里

3 个答案:

答案 0 :(得分:18)

实际上popupWindow支持“换行内容”constans,所以如果你想让弹出窗口与你的视图完全一致 - 请使用:

popup = new PopupWindow(context);
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

- 其他选项 -

getWidth()getHeight()返回零,因为只有在屏幕上绘图后视图才有大小。您可以尝试从LayoutParams的充气视图中获取值。

如果有fill_parent值 - 你处于鸡蛋状态。

如果pxdp中有值,您可以手动计算像素大小:

Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics()));

如果有wrap_content值 - 您可以使用view.measure()方法 - 所有子项和视图本身都会被衡量,您可以获得view.getMeasuredHeight()view.getMeasuredWidth()

答案 1 :(得分:7)

正如Jin35所说,你的问题是视图的宽度和高度尚未计算......尺寸直到布局通过后才计算。

使用维度资源的固定宽度和高度(例如,来自值/ dimens.xml文件)是一种解决方法,从那时起您无需等待视图的onMeasure发生 - 您可以获得值您用于您感兴趣的视图的相同维度资源,并使用它。

更好的解决方案是延迟计算,直到onMeasure发生。你可以通过覆盖onMeasure来做到这一点,但更优雅的解决方案是使用这样的临时OnGlobalLayoutListener:

View popup = LayoutInflator.inflate(int resId);
if(popup != null) {

    // set up an observer that will be called once the listView's layout is ready
    android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver();
    if (viewTreeObserver.isAlive()) {

        viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

                // This will be called once the layout is finished, prior to displaying.

                View popup = findViewById(resId);

                if(popup != null) {
                    int width = popup.getMeasuredWidth();
                    int height = popup.getMeasuredHeight();

                    // don't need the listener any more
                    popup.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }
            }
        });
    }
}

答案 2 :(得分:-3)

请试试这个:

Display display = getWindowManager().getDefaultDisplay();
Log.e("", "" + display.getHeight() + " " + display.getWidth());