看到许多文章通过获取 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;}