当前位置: 首页 > news >正文

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)}
}

http://www.lryc.cn/news/619359.html

相关文章:

  • 算法题打卡力扣第11题:盛最多水的容器(mid)
  • [AI React Web]`意图识别`引擎 | `上下文选择算法` | `url内容抓取` | 截图捕获
  • 【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
  • BGE:智源研究院的通用嵌入模型家族——从文本到多模态的语义检索革命
  • 海洋通信系统技术文档(1)
  • 高可用实战之Nginx + Apache篇
  • QT常用类解析
  • ubuntu20.04下C++实现点云的多边形区域过滤(2种实现:1、pcl的CropHull滤波器;2、CUDA上实现射线法)
  • 在Ubuntu24.04中使用ssh连接本地git仓库到github远程仓库
  • C++QT HTTP与HTTPS的使用方式
  • 【网络安全测试】OWASP ZAP web安全测试工具使用指导及常用配置(有关必回)
  • Spring事务管理实战:从注解到进阶
  • Spring 源码学习(十)—— DispatcherServlet
  • 【一步AI】模型压缩:减小模型体积与计算量
  • YOLOv8 级联检测:在人脸 ROI 内检测眼镜(零改源码方案)
  • 第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(1 、庆典队列)
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • [QtADS]解析demo.pro
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • Electron自定义菜单栏及Mac最大化无效的问题解决
  • XML头部声明发送者信息的实现方法
  • C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解
  • CV 医学影像分类、分割、目标检测,之【肝脏分割】项目拆解
  • windows常用的快捷命令
  • 机器学习实战·第三章 分类(2)
  • docker 容器内编译onnxruntime
  • git clone 支持在命令行临时设置proxy
  • CV 医学影像分类、分割、目标检测,之【腹腔多器官语义分割】项目拆解
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Video_AVI_Packet(2)