Android4.4、Android5.0+状态栏颜色、透明等设置


Android 4.4


Manifest文件Activity的Theme设置:

[html] view plain copy
 print?
  1. <style name="theme_main" parent="android:Theme">  
  2.   
  3.         <!-- 隐藏系统标题栏 -->  
  4.         <item name="android:windowNoTitle">true</item>  
  5.   
  6.         <!-- 透明标题栏 -->  
  7.         <item name="android:windowTranslucentStatus">true</item>  
  8.   
  9.     </style>  

代码中设置:

[java] view plain copy
 print?
  1. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  2.             Window window = getWindow();  
  3.             window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  
  4.         }  

以上设置都是让状态栏透明,让页面布局从状态栏开始,如果想改变状态栏颜色需要在页面布局的最外层加入

android:fitsSystemWindows="true"

或者是在代码里加入

[java] view plain copy
 print?
  1. <span style="font-size:14px;">if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  2.             Window window = getWindow();  
  3.             window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  
  4.             //set child View not fill the system window  
  5.             ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);  
  6.             View mChildView = mContentView.getChildAt(0);  
  7.             if (mChildView != null) {  
  8.                 ViewCompat.setFitsSystemWindows(mChildView, true);  
  9.             }  
  10.         }</span>  

注:必须是在setContentView()以后执行

状态栏的颜色以最外层布局的背景色为准。




Android 5.0+


1.在Manifest文件中配置Activity的theme,设置状态栏颜色,主题颜色等。

Android4.4、Android5.0+状态栏颜色、透明等设置
Android4.4、Android5.0+状态栏颜色、透明等设置
[html] view plain copy
 print?
  1. <style name="AppBaseTheme" parent="android:ThemeOverlay.Material.Dark.ActionBar">  
  2.         <!-- 隐藏系统标题栏 -->  
  3.         <item name="android:windowNoTitle">true</item>  
  4.   
  5.         <!-- Main theme colors -->  
  6.         <!-- App主题颜色(滑动阴影等)   your app's branding color (for the app bar)-->  
  7.         <item name="android:colorPrimary">#FF6600</item>  
  8.   
  9.         <!-- 状态栏颜色   darker variant of colorPrimary (for status bar, contextual app bars) -->  
  10.         <item name="android:colorPrimaryDark">#e86053</item>  
  11.   
  12.         <!-- 控件主题样式(例如EditText,CheckBox,RadioButton等)  theme UI controls like checkboxes and text fields -->  
  13.         <item name="android:colorAccent">#BFDF0F</item>  
  14.   
  15.   
  16.         <!-- 系统默认控件样式 -->  
  17.         <!-- 点击时颜色 -->  
  18.         <!--<item name="android:colorControlHighlight">#0000FF</item>-->  
  19.         <!-- 正常状态下颜色 -->  
  20.         <!--<item name="android:colorControlNormal">#FF0000</item>-->  
  21.         <!-- 选中时颜色 -->  
  22.         <!--<item name="android:colorControlActivated">#00FF00</item>-->  
  23.   
  24.     </style>  

2.在代码中设置状态栏颜色

[java] view plain copy
 print?
  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
  2.             Window window = getWindow();  
  3.             //After LOLLIPOP not translucent status bar  
  4.             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  
  5.             //Then call setStatusBarColor.  
  6.             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  
  7.             window.setStatusBarColor(Color.BLUE);  
  8.         }  

3.设置状态栏透明(目前只找到在代码中设置)

[java] view plain copy
 print?
  1. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
  2.             Window window = getWindow();  
  3.             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS  
  4.                     | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  5.             window.getDecorView().setSystemUiVisibility(  
  6.                     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
  7.                             | View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  8.             );  
  9.             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  
  10.             window.setStatusBarColor(Color.TRANSPARENT);  
  11.         }  

  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模式),状态栏上一些图标显示会被隐藏。


* window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

  Flag表明这个窗口负责绘制系统状态栏标题栏的背景。如果设置,系统bar绘制成透明背景,在这个窗口相应的地方会填充{@link Window#getStatusBarColor()}和       {@link Window#getNavigationBarColor()}对应的颜色。



虚拟按键相关设置

api >= 19
[html] view plain copy
 print?
  1. <span style="font-size:12px;"><item name="android:windowTranslucentNavigation">true</item></span>  
[java] view plain copy
 print?
  1. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  2.             Window window = getWindow();  
  3.             window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  4.         }  
虚拟按键底部有阴影


api >= 21
[java] view plain copy
 print?
  1. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  2.             Window window = getWindow();  
  3.             window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  4.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
  5.                 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  6.                 window.getDecorView().setSystemUiVisibility(  
  7.                     View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  8.                 );  
  9.                 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  
  10.                 window.setNavigationBarColor(Color.TRANSPARENT);  
  11. //                window.setNavigationBarColor(Color.BLUE);  
  12.             }  
  13.         }  
可以改变虚拟按键的背景色,没有阴影(貌似在theme配置文件里好像改不了颜色)



更改状态栏字体颜色为深色(Android6.0 +)

[html] view plain copy
 print?
  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  2.                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);  
  3.            }