Android Status bar 深色模式設定


深色模式下 status bar 的 icon 也被背景吃掉了嗎?教你如何把 icon 找回來!

Android 顯示時間、網路狀態、電量以及應用程式的通知會出現在畫面置頂的 status bar,有些需求會希望 status bar 的背景透明化,當 status bar 背景設定透明化後,深色模式時的 icon 顏色應該為淺色,反之淺色模式時的 icon 顏色應調整為深色,預知詳情如何實作請看本文分曉。

status bar 透明化

參考了 Android Status Bar 透明化 Transparent 這篇文章,先在專案中的 Activity 設定以下的 window decorView flag 如下:

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = Color.TRANSPARENT
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

成功把 status bar 背景變透明後,要再把 layout 中置頂的 component 加上 status bar height 的 padding,才不會讓部分 layout 被 status bar 給擋住。

上述透過 window decorView flag 的方式屬於動態管理 status bar 的顯示,或是也可以透過 XML 靜態指定 status bar 的顯示。在 resource 的 XML 加上:

<item name="android:windowTranslucentNavigation">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">false</item> 

android:windowLightStatusBar 為 false 以及 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 的設定都是讓 status bar 的 icon 顯示為灰色,儘管在一般模式若是淺色背景下就很清楚,但如果是在深色模式下灰色的 icon 就會被吃掉!

深色模式的 status bar

當深色模式時 status bar 的 icon 顏色應該調整回預設的白色,若為動態設置的方法要把 decorView 的 flag 從 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 調整回預設的 SYSTEM_UI_FLAG_VISIBLE

靜態設置 status bar icon 顏色的話則在 resource 的 XML 加上:

<item name="android:windowLightStatusBar">false</item> 

因為靜態設置的方式會綁定 theme,因此對於同個 Activity 中有多個深淺色設定 Fragment 的情況就不適用,還是需要透過動態的方式才能針對各個頁面進行設定。

#Android #Statusbar







你可能感興趣的文章

Java 學習筆記 01 – 開發環境

Java 學習筆記 01 – 開發環境

Unveiling Dubai's Finest: A Guide to Top-Tier SEO Services

Unveiling Dubai's Finest: A Guide to Top-Tier SEO Services

day_03: 我好像有點懂函數式了...

day_03: 我好像有點懂函數式了...






留言討論




uuko Feb 29, 2020

恭喜完賽,大大之後還會在這邊更新文章嗎:D
想看您的其他文章QQ 看您的文章讓我學到很多XD

terricom Mar 01, 2020

感謝你的鼓勵!!!
之前其實蠻少分享文章的,但這次完賽後發現自己也是可以克服懶惰辦到的(~‾▿‾)~
之後應該會分享在 medium.com/@mo0922 (努力讓產出可以穩定一些
也希望看到你分享的文章,一起加油!