Как было предложено в этом потоке 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);