WindowController的setAppearanceLightStatusBars切换状态栏文字颜色异常
问题解决方案
首先解决调用setAppearanceLightStatusBars出现布局偏移、状态栏变白的问题,根源是旧版windowTranslucentStatus属性和系统默认fitsSystemWindows行为冲突,不同Android版本对该属性的适配逻辑不一致导致。
步骤1:修改主题配置实现完全透明状态栏
移除原有的android:windowTranslucentStatus配置,替换为以下内容即可实现完全无遮罩的透明状态栏:
<item name="android:statusBarColor">@android:color/transparent</item> <!-- 保留你原有导航栏的颜色配置即可,无原有配置可添加默认值 --> <item name="android:navigationBarColor">@color/你的导航栏默认色</item>
步骤2:Activity初始化配置
在MainActivity的onCreate方法、setContentView之前添加以下代码:
// 允许布局内容延伸到状态栏下方 WindowCompat.setDecorFitsSystemWindows(getWindow(), false); // 初始化WindowInsetsControllerCompat windowController = new WindowInsetsControllerCompat(this.getWindow(), this.getWindow().getDecorView());
步骤3:解决导航栏遮挡内容问题
给Activity根布局设置WindowInsets监听,手动适配底部导航栏高度,避免内容被导航栏遮挡,同时保留状态栏穿透效果。假设根布局id为root_layout,代码如下:
View rootView = findViewById(R.id.root_layout); ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> { Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); // 仅给底部添加等于导航栏高度的padding,避免内容被导航栏遮挡 // 如果页面内容需要避开状态栏,只需把第二个参数改为systemInsets.top即可 view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), systemInsets.bottom); return windowInsets; });
原有setUseSecondaryBackground方法中的状态栏文字切换逻辑无需修改,即可正常运行,兼容你配置的minSdk23到targetSdk31的所有版本。
内容的提问来源于stack exchange,提问作者Avinta
相关产品推荐
相关产品推荐

