2015-01-21 2 views
0

Как было предложено в этом потоке stackoverflow, я использую ViewTreeObserver для ожидания первого макета, чтобы затем измерить ширину и высоту моего tablelayout (это единственный элемент в моем xml, ширина и высота установлены в соответствии с родительским). Тем не менее, я получаю только 0. (Код помещается внутри метода, который вызывается сразу после setContentView в OnCreate)Использование 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» снова для некоторых устройств. Что мне делать?

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

ответ

0

Got ответ через 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; 
Смежные вопросы