如何配置Android系统栏与导航栏实现类Google Pay的沉浸式效果
Android 实现Google Pay同款透明系统栏/导航栏方案
1. 基础主题配置
首先在你的应用主题(res/values/themes.xml)中添加以下配置,适配不同Android版本:
<!-- 基础主题,可替换为你当前使用的主题父类 --> <style name="Theme.YourApp" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 状态栏背景设为完全透明 --> <item name="android:statusBarColor">@android:color/transparent</item> <!-- 导航栏背景设为完全透明 --> <item name="android:navigationBarColor">@android:color/transparent</item> <!-- Android 10以上禁用导航栏默认半透明遮罩 --> <item name="android:enforceNavigationBarContrast">false</item> <!-- 取消系统默认的内容边距限制 --> <item name="android:fitsSystemWindows">false</item> </style>
如果需要适配Android 8.0以下的版本,可以额外在values-v26/themes.xml中单独调整导航栏图标配色规则。
2. Activity 初始化配置
在需要实现该效果的Activity的onCreate方法中,添加以下配置:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 允许应用内容绘制到系统栏和导航栏区域 WindowCompat.setDecorFitsSystemWindows(window, false) // 配置系统栏图标颜色,浅色背景下使用深色图标,适配白色栏的视觉效果 WindowInsetsControllerCompat(window, window.decorView).apply { // 状态栏图标设为深色 isAppearanceLightStatusBars = true // 导航栏图标设为深色 isAppearanceLightNavigationBars = true } setContentView(R.layout.activity_main) // 给可滚动容器添加适配系统栏的padding,避免初始内容被系统栏遮挡 val scrollContainer = findViewById<NestedScrollView>(R.id.scroll_container) ViewCompat.setOnApplyWindowInsetsListener(scrollContainer) { view, insets -> val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) // 给滚动容器设置顶部、底部的padding,对应状态栏、导航栏高度 view.setPadding( view.paddingLeft, systemBarsInsets.top, view.paddingRight, systemBarsInsets.bottom ) insets } }
配置完成后滚动容器的内容会自然延伸到系统栏区域显示,滚动时内容会从系统栏下方穿过,和Google Pay的交互效果完全一致。
3. 注意事项
- 不要在布局的根节点手动设置
android:fitsSystemWindows="true",否则会阻止内容延伸到系统栏区域 - 如果需要动态切换深浅色模式,同步调用
isAppearanceLightStatusBars和isAppearanceLightNavigationBars切换图标颜色即可,不需要改动其他逻辑 - 该方案不会影响原有功能逻辑,所有交互、事件响应都和原有逻辑完全一致
内容的提问来源于stack exchange,提问作者SVK
相关产品推荐
相关产品推荐

