实现状态栏透明
状态栏在themes.xml文件里面添加以下两条可以将状态栏设置为透明状态;
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowLightStatusBar">true</item>这两天只做一件事:把状态栏本身颜色变透明,不会强制让页面布局向上延伸盖住状态栏。
页面能不能填充到状态栏,由根布局类型 + fitsSystemWindows控制。
所以我使用时候ConstraintLayout布局生效了,LinearLayout没有生效。
两者底层区别:
- ConstraintLayout 布局规则:子控件约束到 parent 最顶端,会主动向上侵入状态栏区域Constraint 是坐标约束布局,
layout_constraintTop_toTopOf="parent"强制控件贴屏幕最顶部,无视状态栏分隔,背景会向上铺满状态栏。 - LinearLayout流式顺序排列;默认从状态栏下方开始绘制,不会主动向上延伸;加上居中 + 全局 padding,顶部空白底色直接露出来
解决LinearLayout布局下状态栏和主题颜色不同时候有以下两种方法:
- 根 LinearLayout 加两行属性
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:padding="16dp" android:background="@drawable/ic_backguand" android:orientation="vertical" <!-- 新增这两行 --> android:fitsSystemWindows="false" android:clipToPadding="false">clipToPadding="false":允许布局背景绘制到 padding 区域外,向上填充状态栏。
- 强制布局顶到屏幕最顶端
import android.view.WindowManager override fun onCreate(savedInstanceState: Bundle?) { window.setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) }不要给 LinearLayout 设置
fitsSystemWindows="true",这个属性会自动在顶部加状态栏高度 padding
如果不想修改LinearLayout布局,可以在主题彻底统一透明状态栏
<style name="Base.Theme.Demo" parent="Theme.Material3.DayNight.NoActionBar"> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowLightStatusBar">true</item> <!-- 新增两行关键属性 --> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:windowTranslucentStatus">true</item> </style>windowTranslucentStatus:状态栏完全透明,页面背景向上填充windowDrawsSystemBarBackgrounds:允许页面绘制覆盖状态栏区域
