Android 5.0 及其之後版本:設置屬性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
使得咱們的內容佈局能夠延伸到系統狀態欄,而後直接使用方法 setStatusBarColor()
把系統狀態欄設置成透明就行了。java
Android 4.4 ~ Android 5.0 :添加了屬性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
可讓狀態欄變成透明,而且使咱們們的內容佈局延伸到系統狀態欄。這個屬性雖然也能夠在 Android 5.0 及其之後版本的手機上使用,可是效果不是咱們想要的。android
在 Android 4.4 以前是不支持透明狀態欄微信
須要注意的一點是在設置透明狀態欄的狀況下,是須要咱們的內容佈局延伸到狀態欄的,所以這個時候使用 fitSystemWindows
這個屬性是沒有意義的,只會使得出現各類奇葩的效果。app
其實在有的時候,咱們是不須要把咱們的內容佈局延伸到系統狀態欄的,只是須要系統狀態欄和咱們的內容佈局的顏色搭配起來。函數
Android 5.0 及其之後版本:直接經過 setStatusBarColor()
或者 修改colorPrimaryDark
對應的顏色,把系統狀態欄顏色設置成搭配的顏色就能夠了佈局
Android 4.4 ~ Android 5.0:這個版本實際上是不容許直接修改狀態欄的顏色的,只不過咱們利用了一種巧妙的方法,感受是修改了狀態欄的顏色而已。經過 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS)
是狀態欄透明,而且咱們的佈局也會延伸到狀態欄,給咱們的內容佈局設置一個 padding,給這個 padding 設置一個合適的顏色來充當系統狀態欄的顏色就能夠了。字體
Android 4.4 以前是不支持修改的code
其實狀態欄的適配無外乎這兩點了,注意必定要針對不一樣的 Android 版本使用不一樣的方法,不可亂用,不可混用,否則會有各類奇葩效果!xml
狀態欄永遠是黑底白字,沒有方法改變。上面的全部的方法也是不適用的。對象
Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 這種模式,使用這種模式可使內容佈局佔據狀態欄,效果:
android:fitsSystemWindows = "true" 屬性 能夠理解爲給所使用的佈局設置了狀態欄大小的 padding。只會做用於 Toolbar 和 根佈局。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@color/main_green_00b661" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tb" app:title="@string/activity_status_bar" app:titleTextColor="@android:color/white" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:background="@color/colorAccent"> </android.support.v7.widget.Toolbar>--> <TextView android:fitsSystemWindows="true" android:background="@color/main_green_00b661" android:layout_width="match_parent" android:layout_height="1dp" android:text="11" android:textColor="#000"/> <ImageView android:contentDescription="@string/text_input" android:id="@+id/iv" android:scaleType="fitXY" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:src="@mipmap/imga"/> <TextView android:background="@color/colorAccent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="11" android:textColor="#000"/> </LinearLayout> 好比,佈局是這樣的,fitsSystemWindows 只有在根佈局 LinearLayout 或者 ToolBar 上有用,在別的 View 上使用是沒有效果的。
LinearLayout 使用 fitsSystemWindows
ToolBar 設置 fitsSystemWindows 效果
能夠看到效果了。其實就是至關於給佈局設置了 padding top(高度至關於系統狀態欄的高度),可是考慮到兼容性的問題,若是你直接在佈局中設置 paddingtop 而不是經過 FitsSystemWindows
這個屬性,那麼在 Android 4.4 如下的手機上運行的話,那麼效果就很糟糕了,由於 Android 4.4 如下的手機,系統狀態欄都是始終存在的,也就是說,這樣始終比 Android 4.4 以上系統的手機佈局多一塊 padding ,由於這一塊 padding 無法在系統狀態欄上。可是使用 fitsSystemWindo 就會完美適配了,由於這個屬性在 Android 4.4 如下的系統上是不起做用的。注意在使用 fitsSystemWindow 的時候,顏色問題,不一樣的手機系統,可能會形成延伸到狀態欄的那一塊顏色不一樣,理論上顏色應該和根佈局的顏色同樣。
到了 Android 5.0 關於狀態欄又發生了變化,新增了直接對狀態欄的操做,直接改變狀態欄顏色,這一點在以前版本是沒有的,Android 4.4 雖然能夠實現改變狀態欄顏色的效果,但其實其實是將咱們的佈局佔據了狀態欄,而後狀態欄是透明的。其實顏色仍是咱們佈局的顏色。
對 Android 5.0 的採起
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面對 Android 4.4 的方法是同樣的);
效果圖:
在 Android 6.0 添加了能夠更改狀態欄字體顏色的方法,別的都是和 Android 5.0 同樣的。
狀態欄字體顏色默認是白色。能夠修改成黑色。
方法:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// 方法 /* * 當 insets 視圖插入,window 已經更改了,視圖層次結構調用。容許它調整內容來適應這些窗口。這個 insets 會告訴咱們 status bar、input method 和其餘系統 window 的空間。 一般狀況下咱們是不須要處理此功能的,由於應用程序的默認窗口修飾會將其應用於窗口內容。若是咱們使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 或者 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 的時候,則須要處理這個函數了,這個時候若是咱們不處理,咱們的視圖內容就會默認放在系統視圖的下面。若是咱們但願系統視圖不覆蓋UI的某些部分,則能夠在視圖層次結構中使用此方法。 默認狀況下,只是將 insets(將 insets 設置爲 0 )作爲 View 的 padding。而且返回true。默認狀況下,此行爲是關閉的,可是能夠經過 setFitsSystemWindows(boolean)啓用。 此功能在層次結構中的遍歷是深度優先的。 相同的內容insets對象沿着層次結構向下傳播,所以對其所作的任何更改都將被全部後續視圖看到(包括層次結構中的上層視圖,由於這是深度優先遍歷)。 返回true的第一個視圖將停止整個遍歷。 */ fitSystemWindows(Rect insets);