Android获取状态栏、导航栏的高度

news/2024/11/29 6:40:25/

Android获取状态栏的高度:

方法一:通过资源名称获取, getDimensionPixelSize,获取系统中"status_bar_height"的值,方法如下:

Java:

public static int getStatusBarHeight(Context context) {Resources resources = context.getResources();int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");int height = resources.getDimensionPixelSize(resourceId);return height;
}

Kotlin:

    fun getStatusBarHeight(context: Context): Int {var result = 0val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")if (resourceId > 0) {result = context.resources.getDimensionPixelSize(resourceId)}return result}
方法二:添加布局后获取

Kotlin:

 ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}
方法三:通过setOnApplyWindowInsetsListener
    fun getStatusBarHeightWithListener(activity: Activity, callback: (Int) -> Unit) {activity.window.decorView.setOnApplyWindowInsetsListener { v, insets ->val statusBarHeight = insets.systemWindowInsetTopcallback(statusBarHeight)// 返回insets以允许其他监听器继续接收insets}// 触发布局以尽快调用监听器activity.window.decorView.requestLayout()}

调用:

    getStatusBarHeightWithListener(this) { statusBarHeight ->// 使用statusBarHeightLogUtils.i("getStatusBarHeightWithListener:${statusBarHeight}")}
方法四:通过 WindowInsets 获取

这种方法需要 API 20 (Android 4.4W) 以上,但在较新版本的 Android(API 21及以上)中更为准确。

fun getStatusBarHeight(activity: Activity): Int {val windowInsets = activity.window.decorView.rootWindowInsetsreturn windowInsets?.systemWindowInsetTop ?: 0
}

注意:在 Android 11(API 30)及以上版本可以使用 WindowInsetsCompat 进行更兼容性友好的操作。

import androidx.core.view.WindowInsetsCompat
import androidx.core.view.ViewCompatfun getStatusBarHeight(activity: Activity): Int {val insets = ViewCompat.getRootWindowInsets(activity.window.decorView)return insets?.systemWindowInsetTop ?: 0
}

这种方法直接获取会返回0,需要布局加载完成或者view.post中调用:

    mViewBinding.main.post {LogUtils.i("actionBarHeight:${getStatusBarHeight(this)}")}
方法五:使用固定值24dp(不推荐)

在Android 9.0 frameworks/base/core/res/res/中有如下

    <!-- Height of the status bar --><dimen name="status_bar_height">@dimen/status_bar_height_portrait</dimen><!-- Height of the status bar in portrait --><dimen name="status_bar_height_portrait">24dp</dimen><!-- Height of the status bar in landscape --><dimen name="status_bar_height_landscape">@dimen/status_bar_height_portrait</dimen>

可以看到status_bar_height只有一个定值24dp,因此可以直接使用

Android 9.0的frameworks/base/core/res/res目录源码:https://android.googlesource.com/platform/frameworks/base/+archive/refs/heads/pie-release-2/core/res/res.tar.gz
同理 navigation_bar_height 可以直接用48dp

Android获取导航栏的高度:

fun getNavigationBarHeight(context: Context): Int {var result = 0val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")if (resourceId > 0) {result = context.resources.getDimensionPixelSize(resourceId)}return result
}

http://www.ppmy.cn/news/1550835.html

相关文章

【操作文档】mysql分区操作步骤.docx

1、建立分区表 执行 tb_intercept_notice表-重建-添加分区.sql 文件&#xff1b; DROP TABLE IF EXISTS tb_intercept_notice_20241101_new; CREATE TABLE tb_intercept_notice_20241101_new (id char(32) NOT NULL COMMENT id,number varchar(30) NOT NULL COMMENT 号码,cre…

遗传算法与深度学习实战——进化优化的局限性

遗传算法与深度学习实战——进化优化的局限性 0. 前言1. 数据集加载2. 模型构建相关链接 0. 前言 深度学习 (Deep learning, DL) 模型的规模不断扩大&#xff0c;从早期只有数百个参数的模型到最新的拥有数十亿个参数的 transformer 模型。优化或训练这些网络需要大量的计算资…

【Linux】自定义简易shell

【Linux】自定义简易shell &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 1. 实现思路 2. 实现代码 2.1 输出命令行提示符 2.2 获取用户输入信息 2.3 解析用户输入命令 2.4 …

鸿蒙开发App 如何通过抓包查看 http 网络请求?

通过借助第三方工具 Charles https://www.charlesproxy.com/ https://www.zzzmode.com/mytools/charles/https://www.zzzmode.com/mytools/charles/ Charles 激活码计算器 相关博客日志&#xff1a;https://zhuanlan.zhihu.com/p/281126584 MAC上的使用方法&#xff1a; ch…

c++类模板成员函数的特化

是的&#xff0c;类成员函数可以是模板函数。在C中&#xff0c;类模板和非模板类都可以包含模板成员函数。这种设计允许类在某些成员函数中具有泛型行为&#xff0c;而不需要将整个类设计为模板。 本文将详细介绍类成员函数作为模板函数的概念、声明和定义方法&#xff0c;以及…

算法竞赛(Python)-链表

文章目录 一 链表简介1.1链表定义1.2 双向链表1.3 循环链表 二、链表的基本操作2.1 链表的结构定义2.2 建立一个线性链表2.3 求线性链表的长度2.4 查找元素2.5 插入元素2.5.1 链表头部插入元素2.5.2 链表尾部插入元素2.5.3 链表中间插入元素 2.6 改变元素2.7 删除元素2.7.1 链表…

Linux环境下配置neo4j图数据库

1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装&#xff08;jdk1.8不够用&#xff09; 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…

vue3项目搭建-4-正式启动项目,git管理

安装插件&#xff1a; npm install vue router npm install eslint 完成目录&#xff1a; 需要添置文件夹&#xff1a; apis -> api接口 composables -> 组合函数 directives -> 全局指令 styles -> 全局样式 utils -> 工具函数 git 管理&#xff1a; …