我需要获取应用程序可以在设备上使用的显示矩形的尺寸。为此,我尝试使用:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
我的问题是它给了我整个显示器的高度,并且显示器顶部有一个“状态/通知”栏,应用程序无法使用。
我需要应用程序可以使用的实际维度。
为了帮助您更好地理解这个问题,我会留下一个图片:
答案 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;
}
诀窍在于它会比较屏幕显示指标(您希望以模状状态栏为模)和"实际指标",它是设备的物理像素。
如果尚未发生状态栏高度,则会临时减去状态栏高度。
(在我的测试中,导航栏(包含后退和主页按钮)已被减去。)