【问题标题】:When to get view size from onSizeChanged() during initialization初始化期间何时从 onSizeChanged() 获取视图大小
【发布时间】:2016-02-12 18:15:25
【问题描述】:

我试图在应用程序初始化期间使用视图的onSizeChanged() 获取视图的宽度和高度,但它总是返回 0。我在这里阅读了很多问题,但没有一个有效,我总是得到 0。

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

我也尝试在 onResume() 中检索大小,但似乎我的画布的 onSizeChanged() 仍未被调用。

来自 MainActivity 的代码段

@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();
}

来自画布的代码

@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() 方法。

【问题讨论】:

    标签: android android-canvas android-lifecycle


    【解决方案1】:

    您可以使用在视图显示之前调用的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();
                        }
                    }
                });
    

    【讨论】:

    • 谢谢,成功了。但是我仍然不知道这些方法的调用顺序是什么,所以一旦有人解释它,我会接受它。当布局在onCreate() 中膨胀时,为什么我无法在onResume() 中获得大小?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多