代码记录android怎么实现状态栏导航栏隐藏

代码来源 gitcode.com/gh_mirrors/...

关键代码

kotlin 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val mDecorView = window.decorView as ViewGroup

    //防止系统栏隐藏时内容区域大小发生变化
    var uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态栏遮住。
    uiFlags = uiFlags or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    uiFlags = hideBarBelowR(uiFlags);
    //应用flag
    mDecorView.systemUiVisibility = uiFlags

    val mContentView = mDecorView.findViewById<ViewGroup?>(R.id.content)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val controller = mContentView.windowInsetsController
        controller?.hide(WindowInsets.Type.statusBars())
        controller?.hide(WindowInsets.Type.navigationBars())
        controller!!.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }

    fitsNotchScreen()

}


private fun fitsNotchScreen() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        try {
            val lp: WindowManager.LayoutParams = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp
        } catch (e: Exception) {
        }
    }
}

private fun hideBarBelowR(uiFlags: Int): Int {
    var flags = uiFlags
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        return flags
    }
    window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    // 正确:状态栏 + 导航栏一起隐藏
    flags = flags or (
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            )

    return flags
}

如果是flutter 项目,在flutter端 可能需要调用

ini 复制代码
SystemChrome.setEnabledSystemUIMode(
  SystemUiMode.immersiveSticky,
  overlays: [],
);
相关推荐
三少爷的鞋2 小时前
Main-safe:现代Android 架构真正的分水岭
android
你听得到112 小时前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化
沐怡旸10 小时前
深入解析 Android Performance Analyzer (APA) 底层架构与技术原理
android
李斯维18 小时前
从历史的角度看 Android 软件架构
android·架构·android jetpack
plainGeekDev20 小时前
Activity 间传值 → Navigation 参数
android·java·kotlin
用户416596736935520 小时前
Android WebView 加载 file:// 离线页面调试教程
android·前端
plainGeekDev21 小时前
onActivityResult → ActivityResult API
android·java·kotlin
随遇丿而安1 天前
第10周:Activity 基础功能与生命周期优化
android
alexhilton2 天前
Android车载OS中的Remote Compose
android·kotlin·android jetpack
stringwu2 天前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter