Android R如何实现布局置于状态栏下方?旧废弃API替代方案
Android R 实现布局延伸至状态栏下方方案
Android R(API 30)及以上版本中,原systemUiVisibility属性已被官方废弃,可使用WindowInsetsController相关API实现同等效果,具体实现如下:
核心实现代码
Kotlin 版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 允许布局延伸至系统状态栏区域,等价于旧版两个FLAG的组合效果 window.setDecorFitsSystemWindows(false) // 可选配置:如需状态栏文字/图标显示为深色,添加以下代码 window.insetsController?.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ) } else { // 兼容Android 11以下版本,保留原有实现 window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN } // 设置状态栏为透明色,否则无法看到下层布局内容 window.statusBarColor = Color.TRANSPARENT
Java 版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.setDecorFitsSystemWindows(false); // 可选配置:状态栏文字/图标显示为深色 WindowInsetsController controller = window.getInsetsController(); if (controller != null) { controller.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ); } } else { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } window.setStatusBarColor(Color.TRANSPARENT);
注意事项
- 若不需要调整状态栏文字/图标颜色,可直接删除对应
setSystemBarsAppearance相关代码 - 若存在布局内容被状态栏遮挡的情况,可给需要避开状态栏的控件添加
android:fitsSystemWindows="true"属性,系统会自动为控件添加对应高度的顶部内边距 - 上述代码建议在Activity的
onCreate方法中执行,调用时机和旧方案一致
效果参考

内容的提问来源于stack exchange,提问作者Jéwôm'
相关产品推荐
相关产品推荐

