Android - получение размера панели действий дает противоречивый результат

Почему получение эффективного размера экрана (screen-actionbar-statusbar), как показано ниже, дает разные результаты в разное время? первый раз, когда мой фрагмент запускается и вызывает getEffectiveScreenSize, он ошибается (размер панели действий равен 0), но второй раз, а все остальное - правильно.

Поэтому получение размера панели действий, как показано ниже, не является надежным, почему? Какой правильный и безопасный способ?

public static Point getScreenSize( Activity theActivity )
{
    Display theDisplay = theActivity.getWindowManager().getDefaultDisplay();
    Point sizePoint = new Point();
    theDisplay.getSize( sizePoint );

    return sizePoint;
}

public static int getStatusBarHeight( Activity theActivity ) 
{
    int result = 0;
    int resourceId = theActivity.getResources().getIdentifier( "status_bar_height", "dimen", "android" );

    if (resourceId > 0) 
    {
        result = theActivity.getResources().getDimensionPixelSize( resourceId );
    }

    return result;
}

public static int getActionBarHeight( Activity theActivity )
{ 
    return theActivity.getActionBar().getHeight();
}

public static Point getEffectiveScreenSize( Activity theActivity )
{
    Point screenSize = getScreenSize( theActivity );
    screenSize.y = screenSize.y - getStatusBarHeight( theActivity ) - getActionBarHeight( theActivity );

    return screenSize;
}

Это изменение не помогло:

public static int getActionBarHeight( Activity theActivity )
{ 
    //return theActivity.getActionBar().getHeight();
    int result = 0;
    int resourceId = theActivity.getResources().getIdentifier( "actionbar_bar_height", "dimen", "android" );

    if (resourceId > 0) 
    {
        result = theActivity.getResources().getDimensionPixelSize( resourceId );
    }

    return result;
}

3 ответа

Решение

Я не уверен, почему все ваши методы являются статическими, но более важно, что по какой-то причине вы не включили соответствующий код - где getEffectiveScreenSize используемый?

Лучший ответ, который я могу вам дать, должен основываться на предположениях - вы должны звонить getEffectiveScreenSize в разных точках жизненного цикла - до и после измерения макета и / или до полной инициализации панели действий (возможно, посмотрите на обратные вызовы, связанные с панелью действий).

Если вы хотите, чтобы ваш макет учетной записи для панели действий, есть измерение, которое вы можете использовать для этого

?android:attr/actionBarSize

Если вы пытаетесь сделать или, возможно, остановить наложение содержимого и панели действий, вам, вероятно, придется изменить значение наложения панели действий в своих стилях.

<item name="android:windowActionBarOverlay">bool</item>

Высота ActionBar, вероятно, равна 0 при первом измерении. Дождитесь окончания макета основного вида, затем вы сможете измерить панель действий и отреагировать.

final ViewTreeObserver vto = mainView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Get the ActionBar height here
            vto.removeGlobalOnLayoutListener(this);
        }
    };
);

Убедитесь, что вы даете панели действий достаточно времени для загрузки, прежде чем проверять ее размер. Я уверен, что есть лучшие способы сделать это, но сейчас просто попробуйте немного подождать, пока он не загрузится (вы можете попробовать цикл, который блокирует, пока он не станет нулевого размера)

Другие вопросы по тегам