setSystemUiVisibility与SYSTEM_UI_FLAG_LIGHT_STATUS_BAR已废弃,求替代方案?
替换废弃的
setSystemUiVisibility和SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 嘿,我来帮你搞定这个废弃API的替换问题!从Android 11(API 30)开始,setSystemUiVisibility和相关的SYSTEM_UI_FLAG_*常量被正式废弃,官方推荐用WindowInsetsController来替代。下面是你两段代码的精准等效实现:
代码1的等效实现(设置浅色状态栏文字)
原来的代码是让状态栏图标/文字变为深色(适配浅色状态栏背景),用新API的话,我们通过WindowInsetsController的setSystemBarsAppearance方法来实现:
Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowInsetsController insetsController = window.getInsetsController(); // 设置浅色状态栏(图标/文字为深色) insetsController.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ); } else { // 兼容API 23-29的低版本设备 View decorView = window.getDecorView(); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); }
这里的逻辑很直观:第一个参数是要启用的外观属性,第二个参数是掩码(告诉系统我们要修改哪一项属性)。
代码2的等效实现(清除所有系统UI标志)
原来的decor.setSystemUiVisibility(0)是清除之前设置的所有系统UI可见性、外观修改,恢复默认状态。用新API的话,我们需要同时清除外观修改并恢复系统栏的默认可见性:
Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowInsetsController insetsController = window.getInsetsController(); // 清除所有状态栏、导航栏的外观修改 insetsController.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS | WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS ); // 恢复系统栏的默认可见状态(如果之前有隐藏操作的话) insetsController.show(WindowInsets.Type.systemBars()); } else { // 兼容低版本设备 View decorView = window.getDecorView(); decorView.setSystemUiVisibility(0); }
如果之前只修改过状态栏外观,也可以只传APPEARANCE_LIGHT_STATUS_BARS作为掩码,不过把导航栏的标志也加上会更全面,避免残留其他修改。
另外补充个小细节:如果是用Kotlin开发,代码会更简洁,比如设置浅色状态栏的代码可以写成:
window.insetsController?.apply { setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ) }
内容的提问来源于stack exchange,提问作者NewCEO
相关产品推荐
相关产品推荐

