Android设置setDecorFitsSystemWindows(false)后底部视图被截断原因
问题原因
你调用window.setDecorFitsSystemWindows(false)后,窗口装饰层不再主动避让系统状态栏、导航栏的区域,你的整体布局会直接铺满整个屏幕,延伸到上下系统栏的下层显示。你现在只处理了顶部状态栏的半透明显示逻辑,底部的导航栏直接遮盖了布局底部的按钮,所以才会出现只能看到一个按钮的问题。
解决方案
保留顶部ImageView延伸到状态栏下方效果的前提下,你可以通过适配系统窗口插入位(Insets)解决底部遮挡问题,推荐两种实现方案:
- 方案1:给根布局动态加底部padding
首先给你的布局根ConstraintLayout添加id:
android:id="@+id/root_layout"
之后在Activity的onCreate逻辑中添加Insets适配代码:
// Kotlin 实现示例 val root = findViewById<ConstraintLayout>(R.id.root_layout) ViewCompat.setOnApplyWindowInsetsListener(root) { view, insets -> val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) // 只给根布局加底部padding,顶部不加,保留ImageView延伸到状态栏下的效果 view.setPadding(0, 0, 0, systemBarInsets.bottom) insets }
如果用Java开发,对应代码如下:
// Java 实现示例 ConstraintLayout root = findViewById(R.id.root_layout); ViewCompat.setOnApplyWindowInsetsListener(root, (view, insets) -> { Insets systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()); view.setPadding(0, 0, 0, systemBarInsets.bottom); return insets; });
- 方案2:仅给底部按钮设置bottomMargin
如果你不需要整体布局都避让导航栏,只想让底部按钮不被遮挡,也可以把上述代码里设置根布局padding的逻辑,改成给最底部的Button设置bottomMargin即可,逻辑和上面一致。
如果需要底部导航栏也和状态栏保持统一的半透明风格,可以在你的主题样式中添加以下配置:
<item name="android:navigationBarColor">#80000000</item> <item name="android:enforceNavigationBarContrast" tools:targetApi="q">false</item>
内容的提问来源于stack exchange,提问作者Jéwôm'
相关产品推荐
相关产品推荐

