一,首先我們來(lái)看一下QQ對(duì)于狀態(tài)欄適配的效果圖

從左到右手機(jī)系統(tǒng)版本依次是4.3、5.1、6.0.1的顯示效果,我們后面講解狀態(tài)欄都根據(jù)這個(gè)適配進(jìn)行講解。
二,fitSystemWindow屬性
官方描述:?
Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.?
簡(jiǎn)單描述:?
這個(gè)一個(gè)boolean值的內(nèi)部屬性,讓view可以根據(jù)系統(tǒng)窗口(如status bar)來(lái)調(diào)整自己的布局,如果值為true,就會(huì)調(diào)整view的paingding屬性來(lái)給system windows留出空間,而這個(gè)padding值會(huì)跟手機(jī)狀態(tài)欄的高度一致,這樣就避免了不同手機(jī)狀態(tài)欄高度不一樣,手動(dòng)獲取的麻煩。如果值為false,就不會(huì)調(diào)整view的屬性來(lái)給system window留出空間,也就說(shuō)這個(gè)時(shí)候的狀態(tài)欄會(huì)擋住我們的view。
實(shí)際效果:?
當(dāng)status bar為透明或半透明時(shí)(4.4以上),系統(tǒng)會(huì)設(shè)置view的paddingTop值為一個(gè)適合的值(status bar的高度)讓view的內(nèi)容不被上拉到狀態(tài)欄(被狀態(tài)欄擋住),當(dāng)在不占據(jù)status bar的情況下(4.4以下)會(huì)設(shè)置paddingTop值為0(因?yàn)闆]有占據(jù)status bar所以不用留出空間),這個(gè)時(shí)候的狀態(tài)欄是系統(tǒng)默認(rèn)黑色背景的狀態(tài)欄。
三,主題theme
在實(shí)際操作之前我們需要設(shè)置我們的默認(rèn)主題:
使用Theme.AppCompat.Light.NoActionBar(toolbar的兼容主題):既可以適配使用toolbar(由于google已經(jīng)不再建議使用action bar了,而是推薦使用toolbar,且toolbar的使用更加的靈活,所以toolbar和actionbar的選擇也沒什么好糾結(jié)的)和不使用toolbar的情況(即自定義topBar布局)。
設(shè)置狀態(tài)為透明色,通過(guò)如下代碼
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//版本4.4
????????????Window window = getWindow();
? ? ? ? ? ? // Translucent status bar
? ? ? ? ? ? window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
? ? ? ? ? ? ?WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
? }
通過(guò)此代碼設(shè)置狀態(tài)欄透明,在配合fitSystemWindow。我們會(huì)發(fā)現(xiàn)如最開始的三張圖一樣:
5.0以下版本顯示系統(tǒng)默認(rèn)黑色狀態(tài)欄
5.0-6.0狀態(tài)欄為半透明狀態(tài)
6.0以上為透明狀態(tài)。
四,實(shí)戰(zhàn)效果
頁(yè)面activity 繼承 appcompatActivity 設(shè)置上面的主題 引入appcompat-v7的兼容包 版本在23以上
設(shè)置狀態(tài)欄透明

下面是布局文件。最外面是一個(gè)線性布局,textView是一個(gè)標(biāo)題欄。下面是兩個(gè)跳轉(zhuǎn)按鈕

fitSystemWindow=true效果,我們發(fā)現(xiàn)"標(biāo)題欄"三個(gè)字是center狀態(tài) 但是卻沒有居中下移了。是因?yàn)閠rue狀態(tài)以后,給默認(rèn)增加了padding,給系統(tǒng)status bar預(yù)留了位置

fitSystemWindow=false效果,我們發(fā)現(xiàn)標(biāo)題欄被遮擋了,因?yàn)閷傩詾閒alse,沒有給系統(tǒng)狀態(tài)欄預(yù)留位置,所以導(dǎo)致的。

fitSystemWindow一般作用于。setContentView中View的第一個(gè)View??梢允且粋€(gè)不同的View,也可以是ViewGroup,當(dāng)然ToolBar也是可以的。
下一篇文章我們會(huì)詳細(xì)介紹,標(biāo)題一中,狀態(tài)欄的實(shí)現(xiàn)。
參考文章 :http://blog.csdn.net/ys408973279/article/details/49994407

歡迎掃碼關(guān)注個(gè)人公眾號(hào)“Code之旅”
個(gè)人gitHub地址:wangxp423 (wangxp) · GitHub
個(gè)人博客地址:http://blog.csdn.net/wangxp423