平时我们运用到的所有App都会用到沉浸式状态栏,它的功能是将系统状态栏透明化,并允许我们的应用从屏幕下方开始布局
如下图:我们的应用是从屏幕下方就开始布局,状态栏的颜色跟我们的标题栏是一致的。如果不使用沉浸式状态栏的话,默认状态栏一般都是灰色或者黑色,并且应用是从状态栏下方开始布局,这样子就会显得整个应用跟状态栏格格不入,影响应用体验。
如何实现沉浸式状态栏:
1.设置我们的应用主题为NoActionBar并且设置windowTranslucentStatus属性为true
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
Customize your theme here.
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
</style>
这样子设置后启动应用你会发现效果如下:
是的,状态栏透明化了,我们的应用也是从屏幕下方开始布局。但是你会发现你的内容跟状态栏的内容重叠了。这当然不是我们想要的效果。
我的标题栏是个RelativeLayout布局,背景是张图片,里面放了一个TextView。我在里面设置了一个属性
android:fitsSystemWindows="true"
这个属性等同于给我的标题栏加了一个和状态栏一样高度的paddingTop,这样子RelativeLayout中的控件就会往下移动,实现我们想要的效果。
遇到的坑:如果你的TextView位置设成layout_centerInParent会出错,状态栏颜色和你的背景图一样但是会覆盖你的标题栏。我也搞不清为啥。
貌似安卓5.0以上开启沉浸式状态栏的时候,状态栏会变成半透明的,会有一层灰色。可以在程序中判断,改为透明就可以了。
//消除状态栏底部的阴影
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
try {
Class decorViewClazz = Class.forName("com.android.internal.policy.DecorView");
Field field = decorViewClazz.getDeclaredField("mSemiTransparentStatusBarColor");
field.setAccessible(true);
field.setInt(getWindow().getDecorView(), Color.TRANSPARENT); //改为透明
} catch (Exception e) {}
}
详细可以参考这篇博客:https://blog.csdn.net/hmmhhmmhmhhm/article/details/77840604