沉浸式狀態(tài)欄實現(xiàn)及遇到的坑

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)欄的過程中踩了不少的坑驯击,特此記錄下來。

如何實現(xiàn)狀態(tài)欄

Android 4.4以上實現(xiàn)方式

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)欄并不是全透明的,而是漸變的肿轨。

Android 5.0以上實現(xiàn)方式

你會發(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上的坑

將上面的沉浸式代碼放在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上的坑

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的方法請指點一下戈抄,謝謝!:笞ā呛凶!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市行贪,隨后出現(xiàn)的幾起案子漾稀,更是在濱河造成了極大的恐慌,老刑警劉巖建瘫,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崭捍,死亡現(xiàn)場離奇詭異,居然都是意外死亡啰脚,警方通過查閱死者的電腦和手機殷蛇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門实夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粒梦,你說我怎么就攤上這事亮航。” “怎么了匀们?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵缴淋,是天一觀的道長。 經(jīng)常有香客問我泄朴,道長重抖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任祖灰,我火速辦了婚禮钟沛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘局扶。我一直安慰自己恨统,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布三妈。 她就那樣靜靜地躺著延欠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沈跨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天兔综,我揣著相機與錄音饿凛,去河邊找鬼。 笑死软驰,一個胖子當(dāng)著我的面吹牛涧窒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锭亏,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纠吴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慧瘤?” 一聲冷哼從身側(cè)響起戴已,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锅减,沒想到半個月后糖儡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡怔匣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年握联,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡金闽,死狀恐怖纯露,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情代芜,我是刑警寧澤埠褪,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站蜒犯,受9級特大地震影響组橄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罚随,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一玉工、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淘菩,春花似錦遵班、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汇在,卻和暖如春翰萨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糕殉。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工亩鬼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阿蝶。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓雳锋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡洁。 傳聞我的和親對象是個殘疾皇子玷过,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容