Android狀態(tài)欄的適配匯總
1.要求狀態(tài)欄透明,我們的內容布局延伸到系統狀態(tài)欄,就是人們口中說的沉浸式狀態(tài)欄:
Android 5.0 及其以后版本:設置屬性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
使得我們的內容布局可以延伸到系統狀態(tài)欄,然后直接使用方法 setStatusBarColor() 把系統狀態(tài)欄設置成透明就好了。
Android 4.4 ~ Android 5.0 :添加了屬性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
可以讓狀態(tài)欄變成透明,并且使我們們的內容布局延伸到系統狀態(tài)欄。這個屬性雖然也可以在 Android 5.0 及其以后版本的手機上使用,但是效果不是我們想要的。
在 Android 4.4 之前是不支持透明狀態(tài)欄
需要注意的一點是在設置透明狀態(tài)欄的情況下,是需要我們的內容布局延伸到狀態(tài)欄的,因此這個時候使用 fitSystemWindows 這個屬性是沒有意義的,只會使得出現各種奇葩的效果。
2.狀態(tài)欄顏色和我們布局顏色搭配
其實在有的時候,我們是不需要把我們的內容布局延伸到系統狀態(tài)欄的,只是需要系統狀態(tài)欄和我們的內容布局的顏色搭配起來。
**Android 5.0 及其以后版本:**直接通過 setStatusBarColor() 或者 修改colorPrimaryDark 對應的顏色,把系統狀態(tài)欄顏色設置成搭配的顏色就可以了
**Android 4.4 ~ Android 5.0:**這個版本其實是不允許直接修改狀態(tài)欄的顏色的,只不過我們利用了一種巧妙的方法,感覺是修改了狀態(tài)欄的顏色而已。通過 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS)
是狀態(tài)欄透明,并且我們的布局也會延伸到狀態(tài)欄,給我們的內容布局設置一個 padding,給這個 padding 設置一個合適的顏色來充當系統狀態(tài)欄的顏色就可以了。
Android 4.4 之前是不支持修改的
其實狀態(tài)欄的適配無外乎這兩點了,注意一定要針對不同的 Android 版本使用不同的方法,不可亂用,不可混用,不然會有各種奇葩效果!
效果圖
Android 4.4 以前
狀態(tài)欄永遠是黑底白字,沒有方法改變。上面的所有的方法也是不適用的。
Android 4.4~Android 5.0
Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 這種模式,使用這種模式可以使內容布局占據狀態(tài)欄,效果:
android:fitsSystemWindows = "true" 屬性 可以理解為給所使用的布局設置了狀態(tài)欄大小的 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(高度相當于系統狀態(tài)欄的高度),但是考慮到兼容性的問題,如果你直接在布局中設置 paddingtop 而不是通過 FitsSystemWindows 這個屬性,那么在 Android 4.4 以下的手機上運行的話,那么效果就很糟糕了,因為 Android 4.4 以下的手機,系統狀態(tài)欄都是始終存在的,也就是說,這樣始終比 Android 4.4 以上系統的手機布局多一塊 padding ,因為這一塊 padding 沒法在系統狀態(tài)欄上。但是使用 fitsSystemWindo 就會完美適配了,因為這個屬性在 Android 4.4 以下的系統上是不起作用的。注意在使用 fitsSystemWindow 的時候,顏色問題,不同的手機系統,可能會造成延伸到狀態(tài)欄的那一塊顏色不同,理論上顏色應該和根布局的顏色一樣。
Android 5.0
到了 Android 5.0 關于狀態(tài)欄又發(fā)生了變化,新增了直接對狀態(tài)欄的操作,直接改變狀態(tài)欄顏色,這一點在之前版本是沒有的,Android 4.4 雖然可以實現改變狀態(tài)欄顏色的效果,但其實實際上是將我們的布局占據了狀態(tài)欄,然后狀態(tài)欄是透明的。其實顏色還是我們布局的顏色。
對 Android 5.0 的采取
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面對 Android 4.4 的方法是一樣的);
效果圖:
Android 6.0
在 Android 6.0 添加了可以更改狀態(tài)欄字體顏色的方法,別的都是和 Android 5.0 一樣的。
狀態(tài)欄字體顏色默認是白色。可以修改為黑色。
方法: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)啟用。 此功能在層次結構中的遍歷是深度優(yōu)先的。 相同的內容insets對象沿著層次結構向下傳播,因此對其所做的任何更改都將被所有后續(xù)視圖看到(包括層次結構中的上層視圖,因為這是深度優(yōu)先遍歷)。 返回true的第一個視圖將中止整個遍歷。 */ fitSystemWindows(Rect insets);
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。