显示指标减去状态栏?

时间:2011-05-04 16:22:28

标签: android

我需要获取应用程序可以在设备上使用的显示矩形的尺寸。为此,我尝试使用:

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

我的问题是它给了我整个显示器的高度,并且显示器顶部有一个“状态/通知”栏,应用程序无法使用。

我需要应用程序可以使用的实际维度。

为了帮助您更好地理解这个问题,我会留下一个图片:

enter image description here

2 个答案:

答案 0 :(得分:37)

所有这一切的最大诀窍是,在布局完成之前,您通常无法访问该视图大小的真实值。这意味着onCreate()(通常也是onResume())在进行计算的过程中还为时过早。以下代码将为您提供一个表示Activity的内容视图的视图,此时您可以检查其高度和宽度:

View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
Log.d("DISPLAY", content.getWidth() + " x " + content.getHeight());

这也说明了您在Activity中设置的所有标题视图。当XML被夸大时,您还可以获得对设置为内容视图的根布局的引用,如果在两个维度中将布局设置为fill_parent,则执行相同的操作。

我经常拨打这样的电话的好方法是onWindowFocusChanged(),当您的活动对用户可见时,将会调用此方法。

希望有帮助!

答案 1 :(得分:3)

此调用与您调用它的时间点无关:

...
Point dimensions = getDisplayDimensions(context);
int width = dimensions.x;
int height = dimensions.y;
...

@NonNull
public static Point getDisplayDimensions( Context context )
{
    WindowManager wm = ( WindowManager ) context.getSystemService( Context.WINDOW_SERVICE );
    Display display = wm.getDefaultDisplay();

    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics( metrics );
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;

    // find out if status bar has already been subtracted from screenHeight
    display.getRealMetrics( metrics );
    int physicalHeight = metrics.heightPixels;
    int statusBarHeight = getStatusBarHeight( context );
    int navigationBarHeight = getNavigationBarHeight( context );
    int heightDelta = physicalHeight - screenHeight;
    if ( heightDelta == 0 || heightDelta == navigationBarHeight )
    {
        screenHeight -= statusBarHeight;
    }

    return new Point( screenWidth, screenHeight );
}

public static int getStatusBarHeight( Context context )
{
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier( "status_bar_height", "dimen", "android" );
    return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}

public static int getNavigationBarHeight( Context context )
{
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier( "navigation_bar_height", "dimen", "android" );
    return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}

诀窍在于它会比较屏幕显示指标(您希望以模状状态栏为模)和"实际指标",它是设备的物理像素。

如果尚未发生状态栏高度,则会临时减去状态栏高度。

(在我的测试中,导航栏(包含后退和主页按钮)已被减去。)