Android4.4、Android5.0+状态栏颜色、透明等设置
Android 4.4
Manifest文件Activity的Theme设置:
- <style name="theme_main" parent="android:Theme">
- <!-- 隐藏系统标题栏 -->
- <item name="android:windowNoTitle">true</item>
- <!-- 透明标题栏 -->
- <item name="android:windowTranslucentStatus">true</item>
- </style>
代码中设置:
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- }
以上设置都是让状态栏透明,让页面布局从状态栏开始,如果想改变状态栏颜色需要在页面布局的最外层加入
android:fitsSystemWindows="true"
或者是在代码里加入
- <span style="font-size:14px;">if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- //set child View not fill the system window
- ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
- View mChildView = mContentView.getChildAt(0);
- if (mChildView != null) {
- ViewCompat.setFitsSystemWindows(mChildView, true);
- }
- }</span>
注:必须是在setContentView()以后执行
状态栏的颜色以最外层布局的背景色为准。
Android 5.0+
1.在Manifest文件中配置Activity的theme,设置状态栏颜色,主题颜色等。
- <style name="AppBaseTheme" parent="android:ThemeOverlay.Material.Dark.ActionBar">
- <!-- 隐藏系统标题栏 -->
- <item name="android:windowNoTitle">true</item>
- <!-- Main theme colors -->
- <!-- App主题颜色(滑动阴影等) your app's branding color (for the app bar)-->
- <item name="android:colorPrimary">#FF6600</item>
- <!-- 状态栏颜色 darker variant of colorPrimary (for status bar, contextual app bars) -->
- <item name="android:colorPrimaryDark">#e86053</item>
- <!-- 控件主题样式(例如EditText,CheckBox,RadioButton等) theme UI controls like checkboxes and text fields -->
- <item name="android:colorAccent">#BFDF0F</item>
- <!-- 系统默认控件样式 -->
- <!-- 点击时颜色 -->
- <!--<item name="android:colorControlHighlight">#0000FF</item>-->
- <!-- 正常状态下颜色 -->
- <!--<item name="android:colorControlNormal">#FF0000</item>-->
- <!-- 选中时颜色 -->
- <!--<item name="android:colorControlActivated">#00FF00</item>-->
- </style>
2.在代码中设置状态栏颜色
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- Window window = getWindow();
- //After LOLLIPOP not translucent status bar
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- //Then call setStatusBarColor.
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLUE);
- }
3.设置状态栏透明(目前只找到在代码中设置)
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- Window window = getWindow();
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
- | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- window.getDecorView().setSystemUiVisibility(
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- );
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.TRANSPARENT);
- }
FLAG_TRANSLUCENT_STATUS //透明状态栏
FLAG_TRANSLUCENT_NAVIGATION //透明导航栏
* setSystemUiVisibility这个方法参数表示的状态比较多,具体如下:
1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。
2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。
2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
* window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Flag表明这个窗口负责绘制系统状态栏标题栏的背景。如果设置,系统bar绘制成透明背景,在这个窗口相应的地方会填充{@link Window#getStatusBarColor()}和 {@link Window#getNavigationBarColor()}对应的颜色。
虚拟按键相关设置
api >= 19
- <span style="font-size:12px;"><item name="android:windowTranslucentNavigation">true</item></span>
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- }
api >= 21
可以改变虚拟按键的背景色,没有阴影(貌似在theme配置文件里好像改不了颜色)
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- window.getDecorView().setSystemUiVisibility(
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- );
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setNavigationBarColor(Color.TRANSPARENT);
- // window.setNavigationBarColor(Color.BLUE);
- }
- }
更改状态栏字体颜色为深色(Android6.0 +)
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
- }