Android使用fitsSystemWindows屬性實現–狀態欄【status_bar】各版本適配方案
首先我們看下qq的status bar在各個android版本系統中適配:
1.Android5.0以上:半透明(APP 的內容不被上拉到狀態)
2.Android4.4以上:全透明(APP 的內容不被上拉到狀態)
3.Android4.4以下:不佔據status bar
這裏我們就按照qq在各個android的版本顯示進行適配:
1.Android5.0以上:material design風格,半透明(APP 的內容不被上拉到狀態)
2.Android4.4(kitkat)以上至5.0:全透明(APP 的內容不被上拉到狀態)
3.Android4.4(kitkat)以下:不佔據status bar
主題:
使用Theme.AppCompat.Light.NoActionBar(toolbar的兼容主題):既可以適配使用toolbar(由於google已經不再建議使用action bar了,而是推薦使用toolbar,且toolbar的使用更加的靈活,所以toolbar和actionbar的選擇也沒什麼好糾結的)和不使用toolbar的情況(即自定義topBar佈局)。
fitSystemWindows屬性:
官方描述:
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.
簡單描述:
這個一個boolean值的內部屬性,讓view可以根據系統窗口(如status bar)來調整自己的佈局,如果值爲true,就會調整view的paingding屬性來給system windows留出空間….
實際效果:
當status bar爲透明或半透明時(4.4以上),系統會設置view的paddingTop值爲一個適合的值(status bar的高度)讓view的內容不被上拉到狀態欄,當在不佔據status bar的情況下(4.4以下)會設置paddingTop值爲0(因爲沒有佔據status bar所以不用留出空間)。
具體適配方案(一邊看代碼一邊解析):
activity_main.xml:
這裏我們include了一個mytoolbar_layout的佈局:
mytoolbar_layout.xml:
在mytoolbar_layout.xml裏:佈局一個 android.support.v7.widget.Toolbar(使用支持包裏的toolbar可以兼容低版本android系統),並設置minHeight=”?attr/actionBarSize”和fitSystemWindows爲true。
MainActivity.java:
在MainActivity.java裏,繼承BaseAcitivity(後面描述),實例化toolbar並調用setSupportActionBar,之後就可以讓toolbar像action bar一樣使用了。
BaseActivity.java:
在BaseActivity.java裏:我們通過判斷當前sdk_int大於4.4(kitkat),則通過代碼的形式設置status bar爲透明(這裏其實可以通過values-v19 的sytle.xml裏設置windowTranslucentStatus屬性爲true來進行設置,但是在某些手機會不起效,所以採用代碼的形式進行設置)。還需要注意的是我們這裏的AppCompatAcitivity是android.support.v7.app.AppCompatActivity支持包中的AppCompatAcitivity,也是爲了在低版本的android系統中兼容toolbar。
AndroidManifest.xml中:使用Theme.AppCompat.Light.NoActionBar主題
最後build.gradle中引入v7支持庫(需要注意v7版本得大於21):
compile ‘com.android.support:appcompat-v7:23.1.1’
看看效果吧(同qq狀態欄效果,依次是:不透明(4.4以下),透明(4.4以上),半透明(5.0以上)):
Android4.4以下:不佔據status bar
Android4.4以上:全透明(APP 的內容不被上拉到狀態)
Android5.0以上:半透明(APP 的內容不被上拉到狀態)
這套適配方案的好處:
1.通過include mytoolbar.xml和mytopbar.xml可以方便的在使用toolbar和使用自定義topbar中進行抉擇。
2.使用fitSystemWindows屬性讓系統幫我們自動適配不同情況下的status bar,讓我們的view的paddingTop獲取到一個合理的值。(還有其他的方案是通過手動設置paddingTop的值來進行適配的:在values-v19裏設置paddingTop值爲25dp,在values裏設置爲0dp,但是在某些自定義的rom裏status bar的高度是被有修改過的。還有就是通過自定義繼承toolbar,在代碼裏動態獲取status bar的高度並設置paddingTop的值,但這樣又弄得太麻煩了)。
自定義topBar的情況(因爲我們的UI設計師不一定跟得上material design的步伐,而且總是在有着不一樣的設計風格,這個時候自定義topbar就最好了如:qq的topbar就是自定義的):
activity_main.xml
在activity_main.xml裏:include自定義的mytopbar_layout.
mytopbar_layout.xml:
修改MainActivity.java:
MainActivity.java裏:我們註釋掉了setSupportActionBar(因爲這是我們自定義的topbar).
同樣看看實現效果吧:
Android4.4以下:不佔據status bar
Android4.4以上:全透明(APP 的內容不被上拉到狀態)
Android5.0以上:半透明(APP 的內容不被上拉到狀態)
最後代碼上傳gitHub(歡迎fork,加星):
https://github.com/CoolThink/StatusBarAdapt.git
syles.xml(定義了顏色屬性)
運行效果圖: