如何獲取Android中屏幕的可用高度?我需要高度減去狀態欄/菜單欄或任何其他可能在屏幕上的裝飾,我需要它適用於所有設備。另外,我需要在onCreate函數中瞭解這一點。我知道這個問題以前已經問過,但我已經嘗試過他們的解決方案,而且他們都沒有工作。這裏有一些我已經嘗試過的東西:在Android中獲取屏幕高度
我已經在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;
這不是窩RK:
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
如果你真的需要在onCreate方法確切大小,你做某事是錯誤的。使用全局佈局偵聽器並在佈局階段完成時運行您的操作是正確的方式,例如@Carnal答案。在全局範圍回調中,您應該在View上使用getMessureadHeight而不是使用getHeight。 – Mikooos
@DanBray - 請查看我提出的解決方案。它絕對有效。 –
任何延遲使用「OnGlobalLayoutListener」獲取維度或將「Runnable」發佈到根視圖的消息隊列的方法都應該有效。 –