Android4.4以前的版本涨椒,狀態(tài)欄都是一塊黑色的,個人認(rèn)為還是比較丑的是辕。自4.4開始猎提,Android已經(jīng)支持透明狀態(tài)欄了(俗稱沉浸式狀態(tài)欄)忧侧。個人認(rèn)為支持沉浸式狀態(tài)欄的app逼格還是比較高的,為了緊跟潮流松逊,我們項目中也準(zhǔn)備加入沉浸式狀態(tài)欄经宏。在實現(xiàn)沉浸式狀態(tài)欄的過程中踩了不少的坑驯击,特此記錄下來。
Android 4.4版本提供了FLAG_TRANSLUCENT_STATUS沪斟,在Activity中加入此flag主之,可以設(shè)置狀態(tài)欄透明李根。代碼如下:
僅僅設(shè)置FLAG_TRANSLUCENT_STATUS房轿,你會發(fā)現(xiàn)界面上的ToolBar會跑到狀態(tài)欄上面去囱持,如下圖:?
通常我們會使用fitsSystemWindows屬性來解決此問題。
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.?
簡單描述:
這個屬性的作用是讓view可以根據(jù)系統(tǒng)窗口(如status bar)來調(diào)整自己的布局,如果值為true凭需,就會調(diào)整view的paingding屬性來給system windows留出空間(即給view添加一個值為狀態(tài)欄高度的top padding)粒蜈。
我們試著給ToolBar設(shè)置一下fitsSystemWindows屬性為true枯怖。布局代碼如下:
4.4的效果圖如下:
注:有些4.4的系統(tǒng)上面狀態(tài)欄并不是全透明的,而是漸變的肿轨。
你會發(fā)現(xiàn)椒袍,已經(jīng)實現(xiàn)了沉浸式狀態(tài)欄效果了藻茂。如果運行在5.0以上的機器上面辨赐,會發(fā)現(xiàn)大部分手機會出現(xiàn)狀態(tài)欄是半透明的,效果圖如下:
我們能不能讓將5.0以上的手機也設(shè)置為和4.4一樣的全透明的狀態(tài)欄呢?答案是肯定的不恭!Android自5.0起县袱,又為我們提供了設(shè)置狀態(tài)欄顏色的API,我們可以自己設(shè)置狀態(tài)欄的顏色筋遭。
在代碼中再加入如下代碼:
再在運行看看效果漓滔,狀態(tài)欄已經(jīng)變成全透明了乖篷。6.0運行效果圖和上面4.4一樣撕蔼,就不再附圖了。
Android 6.0以上設(shè)置狀態(tài)欄字體顏色
默認(rèn)狀態(tài)欄字體顏色是白色的琳骡,如果ToolBar的顏色較淺楣号,那么狀態(tài)欄上白色的字看不怎么清楚。
Android6.0以后藻懒,我們可以使用代碼將狀態(tài)欄字體的顏色設(shè)置為黑色了嬉荆,代碼如下:
設(shè)置了深色狀態(tài)欄字體的效果圖如下:
如果你認(rèn)為已經(jīng)已經(jīng)完美實現(xiàn)了员寇,那真是too young to simple蝶锋。下面是一些我踩過的坑什往。
如果在界面中有EditText的話别威,你會發(fā)現(xiàn)當(dāng)軟件盤彈出的時候(Activity已經(jīng)設(shè)置了adjustResize),ToolBar的內(nèi)容都被頂上去了粥庄,但是EditText輸入框卻被有頂上來(正常情況應(yīng)該是ToolBar沒事惜互,輸入框被軟鍵盤頂上去)琳拭,如下圖:
這是為什么呢白嘁?經(jīng)研究發(fā)現(xiàn)原來是fitsSystemWindows屬性搞的鬼絮缅。哪個View設(shè)置了fitsSystemWindows=true呼股,這個View就會被軟件盤頂上去卖怜。所以說,fitsSystemWindows不能亂用奄抽,會有意想不到的坑逞度。
那能不能不用fitsSystemWindows呢档泽?既然上面說了,fitsSystemWindows=true的作用是給View添加值為狀態(tài)欄高度的padding抑胎,那我們何不自己手動給ToolBar添加padding呢渐北?
我們?nèi)サ鬞oolBar上的fitsSystemWindows屬性赃蛛,并設(shè)置一下ToolBar的padding呕臂,代碼如下:
去掉ToolBar的fitsSystemWindows屬性,并加上加上上面的代碼土砂,軟鍵盤彈出時ToolBar正常了瘟芝,但是輸入框還是沒有彈出來褥琐。
解決方式1?
剛才上面給ToolBar設(shè)置了fitsSystemWindows=true敌呈,結(jié)果ToolBar的內(nèi)容被頂上去了贸宏,那我們能不能給輸入框設(shè)置一個fitsSystemWindows=true屬性呢造寝?試一下就知道了!
試了之后你會發(fā)現(xiàn)吭练,果然可以诫龙,但是輸入框的高度變了,其實是輸入框的padding增加了狀態(tài)欄的高度鲫咽。如果設(shè)計和產(chǎn)品能接受這種效果签赃,那這也不失為一種解決方法。很顯然分尸,一般都不會接受這種效果的,就算設(shè)計和產(chǎn)品能接受箩绍,我們開發(fā)也不能接受孔庭!
那有沒有更好的方法呢?到網(wǎng)上搜索發(fā)現(xiàn)下面一種解決方案材蛛。
解決方式2?
添加上面的類圆到,然后在Activity的onCreate方法中的setContentView后面加上如下代碼:
然后運行,輸入框能夠正常被頂上去卑吭,而且輸入框的布局有沒有受到影響芽淡。
該解決方案的原理是,給界面的根布局設(shè)置一個監(jiān)聽器陨簇,當(dāng)界面大小有變化的時候吐绵,如鍵盤彈出的時候,重新設(shè)置一下根布局的高度河绽,再調(diào)用requestLayout對界面進行重繪己单。
注:不知道這種解決方案會不會引起其他的問題,目前暫時沒有發(fā)現(xiàn)耙饰,如果哪位知道有什么問題纹笼,請指點一下,謝謝苟跪!
將上面的沉浸式代碼放在EMUI3.1系統(tǒng)的手機(如華為榮耀7)上面跑廷痘,你會發(fā)現(xiàn),根本沒有沉浸式效果件已,狀態(tài)欄是透明的笋额,顯示的是桌面上的顏色,如下圖:
經(jīng)驗證篷扩,原來是EMUI3.1系統(tǒng)的原因兄猩,很多App(如網(wǎng)易云音樂等)也是在EMUI3.0上有沉浸式的效果,到了EMUI3.1卻沒有效果了。在EMUI3.1沒有沉浸式效果如果和4.4以前一樣是黑的也就算了枢冤,這樣透明的顯示桌面顏色實在難看鸠姨。
后來發(fā)現(xiàn)去掉下面這句代碼,可以讓其有沉浸式的效果淹真。
效果如下:
不過它的狀態(tài)欄不是全透明的讶迁,而是像某些4.4的系統(tǒng)一樣是漸變的,不過總比原來的效果好。
這里我們加一個判斷,判斷如果不是EMUI3.1的系統(tǒng)吠昭,才調(diào)用clearFlags清除掉FLAG_TRANSLUCENT_STATUS。
具體代碼如下:
ActionMode是一種Context Menu鳞贷,它懸浮在ToolBar活著ActionBar上面。現(xiàn)在已經(jīng)基本上很少app在用ActionMode了虐唠,所以可能很多人可能沒有用過,沒用過的可以看看這篇文章http://blog.csdn.net/xyz_lmn/article/details/12754785惰聂。
公司項目中使用到了ActionMode(歷史遺留代碼)疆偿,在實現(xiàn)沉浸式的效果中,發(fā)現(xiàn)ActionMode并不支持沉浸式搓幌。ActionMode彈出來的時候杆故,狀態(tài)欄會變成黑色的,效果如下:
ActionMode彈出前:
ActionMode彈出后:
遇到這個問題的時候溉愁,第一想法就是能不能和ToolBar一樣給ActionMode設(shè)置一個值為狀態(tài)欄高度的padding处铛,然后將它頂?shù)綘顟B(tài)欄里面去。
在Stackoverflow上面搜了一種方法可以將ActionMode頂?shù)綘顟B(tài)欄上面去拐揭,給Activity加一個Flag即可撤蟆,代碼如下:
看到能將ActionMode頂?shù)綘顟B(tài)欄中去時心里已經(jīng)在開始偷著樂了,接下來只要給ActionMode設(shè)置一個padding即可堂污。然而發(fā)現(xiàn)ActionMode根本沒有提供在代碼中設(shè)置高度和padding的API家肯,只能在style中設(shè)置高度和padding。這樣就有一個問題盟猖,因為Android手機碎片化嚴(yán)重讨衣,導(dǎo)致不同廠商的不同手機狀態(tài)欄的高度不一致,所以使用這個方法會出現(xiàn)有的手機ActionMode彈出時比ToolBar高或者低式镐,不過也還能接受反镇。
如果僅僅這樣也就算了,沒想到又引起了另外一個問題娘汞。在使用上面的flag之后(flag不能亂加啊歹茶,血和淚的教訓(xùn)),雖然ActionMode頂?shù)綘顟B(tài)欄了,但是在某些(如華為)帶虛擬按鍵的手機(虛擬按鍵對開發(fā)者來說也是一個大坑)辆亏,虛擬按鍵會遮擋底部的布局风秤。
只能放棄這種方案,尼瑪扮叨,怎么這么多坑缤弦,讓我哭會(淚崩)!
沒辦法彻磁,問題還是得去解決鞍濉!繼續(xù)尋找其它解決方案衷蜓。累提。。
這時候想到了在Android5.0以上我們可以設(shè)置狀態(tài)欄的顏色磁浇,那可不可以在ActionMode彈出來的時候斋陪,給狀態(tài)欄設(shè)置一個與ToolBar顏色一致的顏色呢?嘗試一下吧置吓,在BaseActivity中重寫startSupportActionMode方法无虚,在里面給狀態(tài)欄設(shè)置顏色,具體代碼如下:
沒想到衍锚,居然可以友题。不過只能兼容5.0以上的手機,4.4還是黑色戴质。目前也只能這樣了度宦,后期項目中估計會將ActionMode干掉吧,到時候就OK了告匠。如果大家又更好兼容ActionMode的方法請指點一下戈抄,謝謝!:笞ā呛凶!