为什么获得如下所示的有效屏幕尺寸(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;
}

最佳答案

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

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

如果您想拥有操作栏的布局帐户,可以使用一个尺寸

?android:attr/actionBarSize


如果您试图使内容和操作栏重叠或停止重叠,则可能必须在样式中更改操作栏叠加的值

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

10-07 15:52