沉浸式状态栏,最简单的理解就是:通知栏会根据手机内容适应性变色。Android对沉浸式的支持是从4.4开始的。
沉浸式状态栏的实现
- 主题
在主题配置中添加<item name="android:windowTranslucentStatus">true</item>
具体如下:
<style name="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!--add-->
<item name="android:windowTranslucentStatus">true</item>
</style>
修改主题即可实现沉浸式,但此时的布局是整体向上移动了,如下图所示:
这个问题可以通过设置toolbar的paddingTop值来优化,让paddingTop值等于状态栏的高。状态栏的高度可以动态获取。
- 代码配置
在onCreate方法里执行getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
可以达到与主题中配置同样的效果。 - 设置顶部的view(大多数时候是toolbar)的padding值
/**
* 获取状态栏高度
* @param context
* @return
*/
public static int getStatusBarHeight(Context context) {
int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
return context.getResources().getDimensionPixelSize(resId);
}
return 0;
}
/**
* 设置顶部view边距
* @param context
* @param view
*/
public static void setHeightAndPadding(Context context, View view) {
if (view != null) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height += getStatusBarHeight(context);
view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),
view.getPaddingRight(),view.getPaddingBottom());
}
}
根据Android版本不同,沉浸式设置不同
- Android 5.0 之前的系统,直接按照上述方法在主题xml或代码中配置,可配置状态栏和虚拟导航栏,注意设置顶部view的边距即可。
- Android 5.0之后的系统,需要手动在代码中设置一下状态栏颜色和布局(因为5.0之后的系统设置中,直接设置window的flag,顶部状态栏默认会有阴影,如果要去掉阴影,则需手动设置状态栏颜色为透明)
- 代码实现
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
//小于Android 4.4不支持沉浸式
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//大于等于Android 5.0手动配置状态栏
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏背景颜色透明
window.setStatusBarColor(Color.TRANSPARENT);
int visibility = window.getDecorView().getSystemUiVisibility();
//布局内容全展示
visibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
//防止内容区域大小发生变化
visibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
window.getDecorView().setSystemUiVisibility(visibility);
} else {
//低于Android 5.0 大于安卓4.4
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
来源:https://blog.csdn.net/qq_35592743/article/details/100032077