当前位置: 首页 > 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.dtcms.com/a/328965.html

相关文章:

  • 用好Spring AI向量存储,全面释放AI潜能:打造高效RAG应用的加速引擎
  • Jetson NX Python环境搭建:使用APT轻松安装NumPy, scikit-learn, OpenCV
  • 【OSPP 开源之夏】Good First issue 第一步—— openEuler Embedded 计划
  • 机器学习⑤【线性回归(Linear Regression】
  • 记录RK3588的docker中启动rviz2报错
  • C++11新特性详解:从列表初始化到线程库
  • Linux系统编程Day13 -- 程序地址空间(进阶)
  • uniapp组件的开关选择器可以这个携带多参数
  • CVPR2025敲门砖丨机器人结合多模态+时空Transformer直冲高分,让你的论文不再灌水
  • docker network 与host的区别
  • Uni-app + Vue3+editor富文本编辑器完整实现指南
  • 学习STM32 脉冲计数实验
  • MySQL相关概念和易错知识点(6)(视图、用户管理)
  • Java 大视界 -- 基于 Java 的大数据可视化在能源互联网全景展示与能源调度决策支持中的应用
  • 深度学习与遥感入门(七)|CNN vs CNN+形态学属性(MP):特征工程到底值不值?
  • 一键自动化:Kickstart无人值守安装指南
  • 【unitrix数间混合计算】2.20 比较计算(cmp.rs)
  • Spring Boot (v3.2.12) + application.yml + jasypt 数据源加密连接设置实例
  • 25个自动化办公脚本合集(覆盖人工智能、数据处理、文档管理、图片处理、文件操作等)
  • 【电气】NPN与PNP
  • [C语言]第二章-从Hello World到头文件
  • 四分位数与箱线图
  • Redis持久化机制详解:RDB与AOF的全面对比与实践指南
  • 动静态库
  • FPGA的PS基础1
  • 【FPGA】初始Verilog HDL
  • c++编程题-笔记
  • kali linux 2025.2安装Matlab的详细教程
  • 通过限制网络访问来降低服务器被攻击风险的方法
  • 服务器如何应对SYN Flood攻击?