關於 Android 狀態欄的適配總結

1.要求狀態欄透明,咱們的內容佈局延伸到系統狀態欄,就是人們口中說的沉浸式狀態欄:

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

2.狀態欄顏色和咱們佈局顏色搭配

其實在有的時候,咱們是不須要把咱們的內容佈局延伸到系統狀態欄的,只是須要系統狀態欄和咱們的內容佈局的顏色搭配起來。函數

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 之前

狀態欄永遠是黑底白字,沒有方法改變。上面的全部的方法也是不適用的。對象

Android4.4如下.png

Android 4.4~Android 5.0

Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 這種模式,使用這種模式可使內容佈局佔據狀態欄,效果:

Android4.4透明no.png

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

Android4.4透明toolbar-yes.png

ToolBar 設置 fitsSystemWindows 效果

Android4.4透明toolbar-yes.png

能夠看到效果了。其實就是至關於給佈局設置了 padding top(高度至關於系統狀態欄的高度),可是考慮到兼容性的問題,若是你直接在佈局中設置 paddingtop 而不是經過 FitsSystemWindows 這個屬性,那麼在 Android 4.4 如下的手機上運行的話,那麼效果就很糟糕了,由於 Android 4.4 如下的手機,系統狀態欄都是始終存在的,也就是說,這樣始終比 Android 4.4 以上系統的手機佈局多一塊 padding ,由於這一塊 padding 無法在系統狀態欄上。可是使用 fitsSystemWindo 就會完美適配了,由於這個屬性在 Android 4.4 如下的系統上是不起做用的。注意在使用 fitsSystemWindow 的時候,顏色問題,不一樣的手機系統,可能會形成延伸到狀態欄的那一塊顏色不一樣,理論上顏色應該和根佈局的顏色同樣。

Android 5.0

到了 Android 5.0 關於狀態欄又發生了變化,新增了直接對狀態欄的操做,直接改變狀態欄顏色,這一點在以前版本是沒有的,Android 4.4 雖然能夠實現改變狀態欄顏色的效果,但其實其實是將咱們的佈局佔據了狀態欄,而後狀態欄是透明的。其實顏色仍是咱們佈局的顏色。

對 Android 5.0 的採起

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面對 Android 4.4 的方法是同樣的);

效果圖:

Android5.0透明no.png

Android 6.0

在 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);

歡迎你們關注個人微信公衆號,和我交流分享

相關文章
相關標籤/搜索