public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Android 系統在 frameworks/base/core/res/res/values/dimens.xml 定義了 <dimen name="status_bar_height">25dp</dimen>,通過資源 ID 反射獲取,無需 Window 對象。
public int getStatusBarHeightFallback() {
try {
Class> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
return 0; // 默認值
}
}
private Integer cachedStatusBarHeight;
public int getStatusBarHeight() {
if (cachedStatusBarHeight != null) return cachedStatusBarHeight;
int h = getResources().getIdentifier("status_bar_height", "dimen", "android");
cachedStatusBarHeight = (h > 0) ? getResources().getDimensionPixelSize(h) : 0;
return cachedStatusBarHeight;
}