Android6.0-14通用透明(沉浸式)状态栏、导航栏适配方法
作者:smice分类:Android
日期:2024-08-23 10:08:422024-08-23阅读:60

每次适配Android透明状态栏(民间大多叫沉浸式状态栏,官方叫无边框显示)都麻烦得要死,搜索了很多,好些单个Activity没有多个Fragment没问题,多个Fragment就只沉浸第一个Fragment。特此记录一下这种适配方法,可以适配单个Activity里有多个Fragment。

第一步

设置主题,parent为Theme.MaterialComponents.DayNight.NoActionBar,添加状态栏、底部导航栏透明item。

<style name="Base.Theme.Browser" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="colorAccent">@color/main_dark_color</item>
        <item name="colorPrimary">@color/main_color</item>
</style>

第二步

在需要设置透明(沉浸式)状态栏的Activity的setContentView方法之前执行如下代码

       /**
     * 设置沉浸式状态栏、导航栏
     * @param window 窗口对象
     */
    fun statusBarImmersive(window: Window) {
        // 是否检测导航栏对比度
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            window.isNavigationBarContrastEnforced = false
        }
        // 添加Flag把状态栏设为可绘制模式
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.addFlags(View.SYSTEM_UI_FLAG_FULLSCREEN)
        window.addFlags(View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
        // 如果为全透明模式,取消设置Window半透明的Flag
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
        window.decorView.systemUiVisibility =
            window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
         // 非夜间模式则设置状态栏、导航栏图标为黑色
        if (!isNightMode(window.context)) {
            window.decorView.systemUiVisibility =
                window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
        }
        // 设置状态栏为透明
        window.statusBarColor = Color.TRANSPARENT
        window.navigationBarColor = Color.TRANSPARENT
    }
    
    /**
     * 是否是夜间(暗色)模式
     */
    fun isNightMode(context: Context): Boolean {
        val currentNightMode =
            context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
        return currentNightMode == Configuration.UI_MODE_NIGHT_YES
    }


弹幕评论