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

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 = 0
        val 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.systemWindowInsetTop
            callback(statusBarHeight)
            // 返回insets以允许其他监听器继续接收
            insets
        }
        // 触发布局以尽快调用监听器
        activity.window.decorView.requestLayout()
    }

调用:

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

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

复制代码
fun getStatusBarHeight(activity: Activity): Int {
    val windowInsets = activity.window.decorView.rootWindowInsets
    return windowInsets?.systemWindowInsetTop ?: 0
}

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

复制代码
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.ViewCompat

fun 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 = 0
    val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
    if (resourceId > 0) {
        result = context.resources.getDimensionPixelSize(resourceId)
    }
    return result
}
相关推荐
阿巴斯甜13 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker13 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952714 小时前
Andorid Google 登录接入文档
android
黄林晴16 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android