Android狀態(tài)欄的適配匯總
1.要求狀態(tài)欄透明,我們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄,就是人們口中說的沉浸式狀態(tài)欄:
Android 5.0 及其以后版本:設(shè)置屬性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 使得我們的內(nèi)容布局可以延伸到系統(tǒng)狀態(tài)欄,然后直接使用方法 setStatusBarColor() 把系統(tǒng)狀態(tài)欄設(shè)置成透明就好了。
Android 4.4 ~ Android 5.0 :添加了屬性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) 可以讓狀態(tài)欄變成透明,并且使我們們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄。這個(gè)屬性雖然也可以在 Android 5.0 及其以后版本的手機(jī)上使用,但是效果不是我們想要的。
在 Android 4.4 之前是不支持透明狀態(tài)欄
需要注意的一點(diǎn)是在設(shè)置透明狀態(tài)欄的情況下,是需要我們的內(nèi)容布局延伸到狀態(tài)欄的,因此這個(gè)時(shí)候使用 fitSystemWindows 這個(gè)屬性是沒有意義的,只會(huì)使得出現(xiàn)各種奇葩的效果。
2.狀態(tài)欄顏色和我們布局顏色搭配
其實(shí)在有的時(shí)候,我們是不需要把我們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄的,只是需要系統(tǒng)狀態(tài)欄和我們的內(nèi)容布局的顏色搭配起來。
**Android 5.0 及其以后版本:**直接通過 setStatusBarColor() 或者 修改colorPrimaryDark 對(duì)應(yīng)的顏色,把系統(tǒng)狀態(tài)欄顏色設(shè)置成搭配的顏色就可以了
**Android 4.4 ~ Android 5.0:**這個(gè)版本其實(shí)是不允許直接修改狀態(tài)欄的顏色的,只不過我們利用了一種巧妙的方法,感覺是修改了狀態(tài)欄的顏色而已。通過 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS) 是狀態(tài)欄透明,并且我們的布局也會(huì)延伸到狀態(tài)欄,給我們的內(nèi)容布局設(shè)置一個(gè) padding,給這個(gè) padding 設(shè)置一個(gè)合適的顏色來充當(dāng)系統(tǒng)狀態(tài)欄的顏色就可以了。
Android 4.4 之前是不支持修改的
其實(shí)狀態(tài)欄的適配無外乎這兩點(diǎn)了,注意一定要針對(duì)不同的 Android 版本使用不同的方法,不可亂用,不可混用,不然會(huì)有各種奇葩效果!
效果圖
Android 4.4 以前
狀態(tài)欄永遠(yuǎn)是黑底白字,沒有方法改變。上面的所有的方法也是不適用的。

Android 4.4~Android 5.0
Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 這種模式,使用這種模式可以使內(nèi)容布局占據(jù)狀態(tài)欄,效果:

android:fitsSystemWindows = "true" 屬性
可以理解為給所使用的布局設(shè)置了狀態(tài)欄大小的 padding。只會(huì)作用于 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 設(shè)置 fitsSystemWindows 效果

可以看到效果了。其實(shí)就是相當(dāng)于給布局設(shè)置了 padding top(高度相當(dāng)于系統(tǒng)狀態(tài)欄的高度),但是考慮到兼容性的問題,如果你直接在布局中設(shè)置 paddingtop 而不是通過 FitsSystemWindows 這個(gè)屬性,那么在 Android 4.4 以下的手機(jī)上運(yùn)行的話,那么效果就很糟糕了,因?yàn)?Android 4.4 以下的手機(jī),系統(tǒng)狀態(tài)欄都是始終存在的,也就是說,這樣始終比 Android 4.4 以上系統(tǒng)的手機(jī)布局多一塊 padding ,因?yàn)檫@一塊 padding 沒法在系統(tǒng)狀態(tài)欄上。但是使用 fitsSystemWindo 就會(huì)完美適配了,因?yàn)檫@個(gè)屬性在 Android 4.4 以下的系統(tǒng)上是不起作用的。注意在使用 fitsSystemWindow 的時(shí)候,顏色問題,不同的手機(jī)系統(tǒng),可能會(huì)造成延伸到狀態(tài)欄的那一塊顏色不同,理論上顏色應(yīng)該和根布局的顏色一樣。
Android 5.0
到了 Android 5.0 關(guān)于狀態(tài)欄又發(fā)生了變化,新增了直接對(duì)狀態(tài)欄的操作,直接改變狀態(tài)欄顏色,這一點(diǎn)在之前版本是沒有的,Android 4.4 雖然可以實(shí)現(xiàn)改變狀態(tài)欄顏色的效果,但其實(shí)實(shí)際上是將我們的布局占據(jù)了狀態(tài)欄,然后狀態(tài)欄是透明的。其實(shí)顏色還是我們布局的顏色。
對(duì) Android 5.0 的采取
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面對(duì) Android 4.4 的方法是一樣的);
效果圖:

Android 6.0
在 Android 6.0 添加了可以更改狀態(tài)欄字體顏色的方法,別的都是和 Android 5.0 一樣的。
狀態(tài)欄字體顏色默認(rèn)是白色??梢孕薷臑楹谏?br />
方法:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// 方法 /* * 當(dāng) insets 視圖插入,window 已經(jīng)更改了,視圖層次結(jié)構(gòu)調(diào)用。允許它調(diào)整內(nèi)容來適應(yīng)這些窗口。這個(gè) insets 會(huì)告訴我們 status bar、input method 和其他系統(tǒng) window 的空間。 通常情況下我們是不需要處理此功能的,因?yàn)閼?yīng)用程序的默認(rèn)窗口修飾會(huì)將其應(yīng)用于窗口內(nèi)容。如果我們使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 或者 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 的時(shí)候,則需要處理這個(gè)函數(shù)了,這個(gè)時(shí)候如果我們不處理,我們的視圖內(nèi)容就會(huì)默認(rèn)放在系統(tǒng)視圖的下面。如果我們希望系統(tǒng)視圖不覆蓋UI的某些部分,則可以在視圖層次結(jié)構(gòu)中使用此方法。 默認(rèn)情況下,只是將 insets(將 insets 設(shè)置為 0 )做為 View 的 padding。并且返回true。默認(rèn)情況下,此行為是關(guān)閉的,但是可以通過 setFitsSystemWindows(boolean)啟用。 此功能在層次結(jié)構(gòu)中的遍歷是深度優(yōu)先的。 相同的內(nèi)容insets對(duì)象沿著層次結(jié)構(gòu)向下傳播,因此對(duì)其所做的任何更改都將被所有后續(xù)視圖看到(包括層次結(jié)構(gòu)中的上層視圖,因?yàn)檫@是深度優(yōu)先遍歷)。 返回true的第一個(gè)視圖將中止整個(gè)遍歷。 */ fitSystemWindows(Rect insets);
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android 動(dòng)畫之AlphaAnimation應(yīng)用詳解
本節(jié)講解AlphaAnimation 動(dòng)畫,窗口的動(dòng)畫效果,淡入淡出什么的,有些游戲的歡迎動(dòng)畫,logo的淡入淡出效果就使用AlphaAnimation,具體的祥看本文,需要的朋友可以參考下2012-12-12
Android自定義View編寫隨機(jī)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android自定義View隨機(jī)驗(yàn)證碼實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android使用Intent發(fā)送短信的實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用Intent發(fā)送短信的實(shí)現(xiàn)方法,結(jié)合簡單實(shí)例形式分析了Android短信發(fā)送功能的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
Android實(shí)現(xiàn)簡潔的APP更新dialog數(shù)字進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡潔的APP更新dialog數(shù)字進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android二級(jí)緩存加載圖片實(shí)現(xiàn)照片墻功能
這篇文章主要為大家詳細(xì)介紹了Android二級(jí)緩存加載圖片實(shí)現(xiàn)照片墻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android實(shí)現(xiàn)果凍滑動(dòng)效果的控件
這篇文章給大家主要介紹了利用Android如何實(shí)現(xiàn)果凍效果滑動(dòng)效果的控件,實(shí)現(xiàn)的效果類似于iOS有阻尼效果的滑動(dòng)控件,一般我們比較親切地稱之為果凍控件,常見的如微信里[我]的那個(gè)面板模塊,即使沒有再多的選項(xiàng),也不會(huì)很生硬的不允許用戶滑動(dòng)。下面來一起看看吧。2016-11-11
去除arraylist容器中的相同的對(duì)象元素的方法
下面小編就為大家?guī)硪黄コ齛rraylist容器中的相同的對(duì)象元素的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
Android編程實(shí)現(xiàn)提取網(wǎng)址鏈接的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)提取網(wǎng)址鏈接的方法,涉及Android針對(duì)字符串的正則匹配操作相關(guān)技巧,需要的朋友可以參考下2016-10-10

