使用 ViewTreeObserver 等待第一个布局不起作用

Using ViewTreeObserver to wait for first layout not working

按照此 Whosebug 线程中的建议,我正在使用 ViewTreeObserver 等待第一个布局,这样我就可以测量我的 tablelayout 的宽度和高度(这是我 xml 中的唯一元素) , 宽度和高度设置为匹配父级)。但是,我只得到 0。(代码放在一个方法中,该方法在 OnCreate 中的 setContentView 之后立即调用)

我尝试使用 getMeasuredWidth/getMeasuredHeight 的全部目的是避免使用度量方法(因为有开销来确定状态栏、导航栏等的高度)

mysquare = (TableLayout) findViewById(R.id.square);        

    ViewTreeObserver viewTreeObserver = mysquare.getViewTreeObserver();
    if (viewTreeObserver.isAlive())
    {
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                if(Build.VERSION.SDK_INT >= 16)
                    mysquare.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                else
                    mysquare.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                screen_width = mysquare.getMeasuredWidth();
                screen_height = mysquare.getMeasuredHeight();
            }
        });
    }

如果我使用下面给出的延迟执行方法(getMeasuredWidth/getMeasuredHeight 在 gameSelectionLayout 中使用),那么我会得到正确的值,前提是延迟值适合特定设备。这很容易导致某些设备再次获得“0”。我应该怎么办?

Handler handler = new Handler();
    handler.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            gameSelectionLayout();
        }
    }, 100);

通过Google Helpouts得到答案解决方案既没有使用ViewTreeObserver也没有延迟执行,而是WindowManager(不知道这个)。代码如下:

    WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point size = new Point();
    if(Build.VERSION.SDK_INT >= 13)
        display.getSize(size);
    else
    {
        size.x = display.getWidth();
        size.y = display.getHeight();
    }
    screen_width = size.x;
    screen_height = size.y;