显示指标减去状态栏?

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

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

我的问题是,它给了我整个显示器的高度,显示器上有一个“状态/通知”栏,应用程序不能使用。

我需要应用程序可以使用的相关维度。

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

在这里输入图像说明

Solutions Collecting From Web of "显示指标减去状态栏?"

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

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

这也可以解释您在“ Activity设置的任何标题视图。 您也可以获得对XML设置时设置为内容视图的根布局的引用,如果该布局在两个维度中均设置为fill_parent,则执行相同的操作。

在我经常打这样的调用的一个好方法是onWindowFocusChanged() ,当你的Activity对用户可见时,将调用这个方法。

希望帮助!

这个调用是独立于你所说的时间点的:

 ... 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; } 

诀窍是,它将屏幕显示度量(你想要的模态状态栏)和“真实指标”(即设备的物理像素)进行比较。

如果还没有发生,那么状态栏高度将被临时减去。

(在我的testing中,导航栏(包含后退和主页button)已经被减去。)