为什么在onResume()中的View上调用getWidth()会返回0?

时间:2014-04-09 19:18:18

标签: android android-layout android-view activity-lifecycle android-viewtreeobserver

我读过的所有内容都表示您无法在构造函数中的getWidth()上调用getHeight()View,但我在onResume()中调用它们。屏幕的布局是不是已经被绘制了?

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

    populateData();
}

private void populateData() {
    LinearLayout test = (LinearLayout) findViewById(R.id.myview);
    double widthpx = test.getWidth();
}

2 个答案:

答案 0 :(得分:4)

你必须等到当前视图的层次结构至少在getWidthgetHeigth返回之前测量!= 0.你可以做的是检索“根”布局并发布一个可运行。在runnable中你应该能够成功检索宽度和高度

root.post(new Runnable() {
     public void run() {
         LinearLayout test = (LinearLayout) findViewById(R.id.myview);
         double widthpx = test.getWidth();
     }
});

答案 1 :(得分:3)

调用onResume()时仍未绘制视图,因此其宽度和高度为0.您可以"捕获"当其大小使用OnGlobalLayoutListener()更改时:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        // Removing layout listener to avoid multiple calls
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            yourView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        else {
            yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }

        populateData();
    }
});

有关其他信息,请查看Android get width returns 0