sidstory
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
}
弹幕评论