参考文章1
参考文章2
沉浸式状态栏就是将标题栏颜色与状态栏颜色设置为同一种颜色,Android不同的版本设置沉浸式方法也不大一样.
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
主题设置,在values-v19
文件夹下
<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
- "android:windowTranslucentStatus"
>true
style>
decorView
布局容器中加入一个与状态栏宽高一样的View
,并且设置这个View
背景与标题栏颜色一样,这样一来就能实现沉浸式的状态栏了.// 伪代码
// 1.获取当前Activity的decorView对象, 最开始decorView中有标题栏View和内容栏View,
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
// 2.将创建的View添加到decorView中
decorView.addView(myView)
// 3.设置不为状态栏留空间
// rootView代表自己写的Activity布局解析后的View
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
// 忽略用户为childView设置的padding属性,将由系统为该View设置paddingTop属性,高度值为状态栏的高度.
ViewCompat.setFitsSystemWindows(rootView,true);
// 设置childView不在padding代表的区域中绘制.
rootView.setClipToPadding(true);
经过以上两步就能够使状态栏的背景与标题栏颜色一致了.
// 首先设置状态栏的颜色
getWindow().setStatusBarColor(getResources().getColor(android.R.color.read));
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 最后还要清楚清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
values-v21
文件夹下面添加主题<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
- "android:windowTranslucentStatus"
>false
- "android:windowDrawsSystemBarBackgrounds">true
- "android:statusBarColor">@android:color/read
style>
6.0沉浸式设置的方法和5.0差不多.6.0做了一点优化,就是可以修改状态栏上的字体颜色与图标颜色.
// 首先设置状态栏的颜色
getWindow().setStatusBarColor(getResources().getColor(android.R.color.read));
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 最后还要清楚清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 设置状态栏上字体颜色和图标颜色为浅黑色的
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
values-v23
文件夹下面添加主题<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
- "android:windowTranslucentStatus"
>false
- "android:windowDrawsSystemBarBackgrounds">true
- "android:statusBarColor">@android:color/holo_red_light
- "android:windowLightStatusBar">true
style>
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
values-v19
文件夹下 <style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
- "android:windowTranslucentStatus"
>true
style>
// 1. 设置状态栏透明
getWindow().setStatusBarColor(Color.TRANSPARENT)
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 2. 视图延伸至状态栏区域,状态栏上浮于视图之上
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
// 最后还要清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 1. 设置状态栏颜色透明
getWindow().setStatusBarColor(Color.TRANSPARENT)
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 2. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: 视图延伸至状态栏区域,状态栏上浮于视图之上
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR: 设置状态栏上字体颜色和图标颜色为浅黑色的
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// 最后还要清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);