初始化期间何时从 onSizeChanged() 获取视图大小

When to get view size from onSizeChanged() during initialization

我试图在应用程序初始化期间使用 onSizeChanged() 视图获取我的视图的宽度和高度,但它总是 return 0。我在这里阅读了很多问题,但是 none 它的工作,我总是只得到 0.

在我的应用程序中,我有一个 canvas,我需要将其大小传递给另一个对象,该对象使用它进行计算。在 canvas 中,我有变量 width a height 来存储大小,并且在 MyActivity 中的初始化期间,它们被传递给该计算。问题是,它总是 returns 0,即使我尝试使用 getWidth() 和 getHeight()。

我也试过在 onResume() 中检索大小,但我的 canvas 的 onSizeChanged() 似乎还没有被调用。

主要片段Activity

@Override
protected void onResume() {
    super.onResume();

    hB = canvas.getW();
    vB = canvas.getH();


    ap = new ActualPosition();
    generator = new PositionGenerator(ap);
    table = new DrawTable(ap, hB, vB);

    generator.runMe();
}

代码来自 canvas

@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
    super.onSizeChanged(w, h, oldW, oldH);

    this.w = w;
    this.h = h;

    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    canvas = new Canvas(bitmap);
}

public int getW() {
    return w;
}
public int getH() {
    return h;
}

所以我想知道在 Activity 生命周期中什么时候调用 onSizeChanged() 方法。

您可以使用在显示视图之前调用的 getViewTreeObserver() 方法。

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    // prevent multiple calls by removing the listener
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        grid.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        grid.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }

                    int mWidth = yourView.getWidth();
                    int mHeight = yourView.getHeight();
                    }
                }
            });