You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置让Fragment显示在透明导航栏后而非状态栏后?

解决方案:让Fragment布局延伸到透明导航栏后,但避开状态栏

嘿,我来帮你搞定这个布局适配需求~ 先分析下你当前的设置问题:你现在同时开启了LAYOUT_HIDE_NAVIGATION和LAYOUT_STABLE,再加上状态栏和导航栏都设为透明,导致布局会同时延伸到两个系统栏后面。要实现只延伸到导航栏后、避开状态栏的效果,只需调整以下几点:

1. 修正System UI Flags

保留让布局延伸到导航栏的Flag,但绝对不要添加SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(这个Flag会让布局延伸到状态栏后面)。修改后的代码:

// 仅保留导航栏相关的布局延伸Flag,确保状态栏区域不被布局覆盖
view?.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE

2. 让布局自动避开状态栏

在你的Fragment根布局XML里添加android:fitsSystemWindows="true",这个属性会让布局自动识别状态栏的高度,为其预留空间,内容从状态栏底部开始显示:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    <!-- 其他属性 -->
    >

    <!-- 你的Fragment内容组件 -->

</LinearLayout>

3. 保留透明栏的设置

你之前设置的状态栏和导航栏透明代码可以完全保留,这部分是对的:

activity?.window?.statusBarColor = Color.TRANSPARENT
activity?.window?.navigationBarColor = Color.TRANSPARENT

4. (可选)API 30+ 更优雅的实现

如果你的应用只支持Android 11(API 30)及以上,推荐用WindowInsetsController来精确控制,代码更清晰:

val window = requireActivity().window
val insetsController = window.insetsController

// 设置两个系统栏为透明
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT

// 让布局延伸到导航栏后,支持滑动唤出导航栏
insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
insetsController?.hide(WindowInsets.Type.navigationBars())

// 强制显示状态栏,且布局不延伸到其后方
insetsController?.show(WindowInsets.Type.statusBars())

这样调整后,你的Fragment内容会乖乖待在状态栏下方,同时延伸到透明导航栏的后方,完全符合你的需求~

内容的提问来源于stack exchange,提问作者sunilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:44