Android - 获取操作栏大小会产生不一致的结果

时间:2014-02-27 23:17:24

标签: android android-actionbar android-screen

为什么获得如下所示的有效屏幕大小(屏幕操作栏状态栏)会给出不同的结果?第一次启动我的片段并调用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 个答案:

答案 0 :(得分:3)

我不确定为什么你的所有方法都是静态的,但是由于某些原因你还没有包含相关的代码 - 使用getEffectiveScreenSize在哪里?

我可以给你的最佳答案必须基于假设 - 你必须在lifecycle之前的不同点调用getEffectiveScreenSize - 在布局测量之前和/或之前操作栏已完全初始化(可能请查看callbacks related to action bar)。

如果您想拥有操作栏的布局帐户,则可以使用该维度

?android:attr/actionBarSize

如果您尝试制作或可能停止内容和操作栏重叠,则可能需要更改样式中操作栏叠加的值

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

答案 1 :(得分:1)

确保在检查其大小之前为操作栏提供足够的时间加载。我确信有一个最佳实践方法可以做到这一点,但是现在只是尝试等待直到它已经加载(你可以尝试一个阻塞的循环,直到它不是大小为零)

答案 2 :(得分:1)

第一次测量时,ActionBar的高度 为0。等到主视图的布局完成,然后你可以测量ActionBar并做出反应。

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