最近做了一个需求,做一个弹窗,但是弹窗位置是动态设置上去的,所以位置是要减去屏幕的状态栏高度,所以查了下android获取状态栏的高度,刚开始使用的是下面的方式:
Rect rc= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rc);
int statusBarHeight= rc.top;
用上边的方式获取之后,我在华为的一个4.0版本手机上运行没有问题,但是当我在一个三星的5.0版本的手机上测试时,却获取不到高度,rc的值一直为零。最后查了一下这个方法依赖于WMS(窗口管理服务的回调),而android在5.0及一些手机上状态栏已经被应用打通了,所以获取不到。(这个是自己感觉,未经实证,希望大家指正)。后来在网上查寻了下大神们的获取方式,有以下两种,都可以准确获取,推荐使用:
//状态栏高度
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
//状态栏高度
int statusHeight = -1;
try {
Class clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}