如何在Android中获取可用屏幕高度?我需要减去状态栏/菜单栏或其他可能显示在屏幕上的装饰物的高度,并且需要适用于所有设备。此外,我需要在onCreate函数中知道这个高度。我已经尝试过其他人提供的解决方案,但都不起作用。以下是我尝试过的一些方法:
我已在API 7-17上测试了此代码。不幸的是,在API 13上,水平和垂直方向都有额外的空间,在API 10、8和7上,底部水平和垂直方向都没有足够的空间。(我没有在过时的API上测试):
我已在API 7-17上测试了此代码。不幸的是,在API 13上,水平和垂直方向都有额外的空间,在API 10、8和7上,底部水平和垂直方向都没有足够的空间。(我没有在过时的API上测试):
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
screenHeight -= getResources().getDimensionPixelSize(resourceId);
这并未考虑状态栏/菜单栏:
Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
这也不行:
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;
也不是这个:
Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
这不起作用:
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
// since SDK_INT = 1;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
try
{
// used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
}
catch (Exception ignored)
{
// Do nothing
}
try
{
// used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
screenWidth = realSize.x;
screenHeight = realSize.y;
}
catch (Exception ignored)
{
// Do nothing
}
我随后使用以下代码从屏幕高度中减去状态栏和菜单栏的高度: 然后我使用以下代码从屏幕高度中减去状态栏和菜单栏的高度:
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
result = 0;
if (screenHeight >= screenWidth)
resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
else
resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (resourceId > 0)
result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
在API 17上,它能正确计算肖像模式下状态栏和菜单栏的高度,但是在横向模式下不行。在API 10上,它返回0。我需要它在所有设备上或最低API 7上都能够理想地工作。
OnGlobalLayoutListener
或将Runnable
发送到根视图的消息队列来延迟获取尺寸的方法都应该可以工作。 - MH.