Android中获取状态栏高度
获取状态栏高度工具类
获取到的高度是px像素值,如果想用dp需要转换
package com.utils;import android.app.Activity;
import android.content.res.Resources;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewConfiguration;public class WindowManagerUtils {public static int getNavigationBarHeight(Activity activity) {int navigationBarHeight = 0;Resources resources = activity.getResources();int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");if (resourceId > 0) {navigationBarHeight = resources.getDimensionPixelSize(resourceId);}// 检查导航栏是否真的存在且可见boolean hasMenuKey = ViewConfiguration.get(activity).hasPermanentMenuKey();boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);boolean isNavBarVisible = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION & activity.getWindow().getDecorView().getSystemUiVisibility()) == 0;if (!hasMenuKey && !hasBackKey && isNavBarVisible) {return navigationBarHeight;}return 0;}public static int getNavigationBarHeight(Window window) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {// Android 11+android.view.WindowInsets insets = window.getDecorView().getRootWindowInsets();if (insets != null) {return insets.getInsets(android.view.WindowInsets.Type.navigationBars()).bottom;} else {return 0;}} else {// Android 5.0 - 10WindowInsetsCompat insetsCompat = ViewCompat.getRootWindowInsets(window.getDecorView());if (insetsCompat != null) {return insetsCompat.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;} else {return 0;}}}public static int dp2px(int dp) {return Math.round(((float) dp) * getDensityDpiScale());}public static int px2dp(int px) {return Math.round(((float) px) / getDensityDpiScale());}
}
使用:
有的机型(测试发现OPPO一款机型)用getNavigationBarHeight(Activity activity)方法获取不到导航栏高度,可添加
getNavigationBarHeight(Window window)方法再次尝试获取高度,该方法需要在视图绘制完成后调用,例如在 onWindowFocusChanged() 或 View.post(Runnable) 中使用
private fun openWindow() {val height = WindowManagerUtils.getNavigationBarHeight(requireActivity())lifecycleScope.launch {//通过测试发现部分机型获取不到导航栏高度height = WindowManagerUtils.getNavigationBarHeight(requireActivity().window)}
}