深色模式下 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 的情況就不適用,還是需要透過動態的方式才能針對各個頁面進行設定。