2015-01-21 61 views
0

如我在stackoverflow线程中所建议的那样,我使用ViewTreeObserver等待第一个布局,以便我可以测量我的tablelayout的宽度和高度(这是我的xml中的唯一元素,宽度和高度被设置为与父母匹配)。然而,我只得到0.(代码放在OnCreate中setContentView之后立即调用的方法内)使用ViewTreeObserver等待第一个布局不起作用

我尝试使用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'。我该怎么办?通过Google Helpouts

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

回答

0

得到答案的解决方案既不使用也不ViewTreeObserver延迟执行,但是窗口管理器(不知道这个)。代码如下:

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;