看到许多文章通过获取 decorView 的 top 或者 getWindowManager().getDefaultDisplay() 的方法来获取状态栏的高度,在转屏或者切换的时候会比较容易出错,这里推荐一种更加准确的方法:
在Frameworks目录下,状态栏的高度和导航栏的高度/宽度均已经有了定义, 我们所要做的只是把他们读取出来
android 4.2.2\frameworks\base\core\res\res\value
所以通过如下方式
private static int sNaviBarHeight = -1;
public static int getNaviBarHeight(Context context) {
if (sNaviBarHeight > 0) {
//获取一次高度后就记录下来,不必每次都去反射
return sNaviBarHeight;
}
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object o = c.newInstance();
Field field = c.getField("navigation_bar_height");
int x = (Integer) field.get(o);
sNaviBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e) {
//对于某些奇葩机器防止高度不能正确获取,留一个默认的hardcode值
final int dp = 48;
float density = context.getResources().getDisplayMetrics().density;
sNaviBarHeight = Math.round(density * dp);
ExceptionHandler.processFatalException(e);
}
return sNaviBarHeight;
}