安卓Q版本新增了暗黑模式,使用者隻需在系統中開啟暗黑模式(MIUI中叫做深色模式),即可開啟全局暗黑模式,這個也需要第三方應用來進行适配
暗黑模式:本質上就是兩套主題的切換,從明亮的主題切換暗色主題的一個過程,網上有很多成熟的第三方主題切換架構可以使用,不過我們這裡講的是利用安卓系統自帶的API進行切換
先上兩張效果圖吧:
明亮模式
暗黑模式
下面是适配步驟:
1、顔色定義:
首先在res/values/attr.xml 檔案下定義控件的屬性值,這裡以顔色為例:
<attr name="tool_main_color" format="color" />
<attr name="tool_main_text_color" format="color"/>
<attr name="tool_second_text_color" format="color"/>
<attr name="tool_theme_text_color" format="color"/>
<attr name="tool_divider_color" format="color"/>
<attr name="tool_main_bg_color" format="color"/>
<attr name="tool_edit_bg_color" format="color"/>
<attr name="tool_btn_pressed_color" format="color"/>
2、主題定義:
在res/values/style.xml 檔案中定義明亮模式的主題和暗色模式的主題:
明亮模式:
<style name="tool_lite_class" parent="Theme.AppCompat.DayNight.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="tool_main_color">@color/color_green</item>
<item name="tool_main_text_color">@color/color_black</item>
<item name="tool_second_text_color">@color/color_black_30</item>
<item name="tool_theme_text_color">@color/color_green</item>
<item name="tool_divider_color">@color/color_green</item>
<item name="tool_edit_bg_color">@color/color_white</item>
<item name="tool_main_bg_color">@color/color_white</item>
<item name="tool_btn_pressed_color">@color/color_white_d9</item>
<item name="colorPrimary">@color/color_green</item>
<item name="colorPrimaryDark">@color/color_green</item>
<item name="colorAccent">@color/color_green</item>
<item name="android:listDivider">@color/color_green</item>
</style>
暗色模式:
<style name="tool_lite_dark" parent="Theme.AppCompat.DayNight.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="tool_main_color">@color/color_black</item>
<item name="tool_main_text_color">@color/color_white</item>
<item name="tool_second_text_color">@color/color_white_60</item>
<item name="tool_theme_text_color">@color/color_gray</item>
<item name="tool_edit_bg_color">@color/color_black_39</item>
<item name="tool_divider_color">@color/color_black</item>
<item name="tool_main_bg_color">@color/color_black_30</item>
<item name="tool_btn_pressed_color">@color/color_gray</item>
<item name="colorPrimary">@color/color_gray</item>
<item name="colorPrimaryDark">@color/color_gray</item>
<item name="colorAccent">@color/color_gray</item>
<item name="android:listDivider">@color/color_gray</item>
</style>
注意:主題一定要繼承自 Theme.AppCompat.DayNight.DarkActionBar 或者 Theme.AppCompat.DayNight ,不同模式下的屬性要保持一緻,屬性值根據不同主題單獨設定即可
3、資源引用:
在布局中利用 ?attr/tool_main_color 來引用你所定義的顔色值
<TextView
android:id="@+id/view_status_bar"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="?attr/tool_main_color" />
4、AndroidManifest修改:
在activity的的清單檔案中添加以下屬性android:configChanges="uiMode"
舉例:
<activity
android:name=".module.decibel.DecibelActivity"
android:configChanges="uiMode" />
5、在activity中設定主題:
當activity初始化時,在setContentView(R.layout.activity_base)
之前先一步設定通過setTheme(R.style.tool_lite_dark)來設定主題樣式,
注意:setTheme()一定要在setContentView()之前調用,否則主題設定無法生效
6、檢查目前系統是否已開啟暗黑模式:
fun getDarkModeStatus(context: Context): Boolean {
val mode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return mode == Configuration.UI_MODE_NIGHT_YES
}
7、監聽系統暗黑主題開啟與關閉
在activity中重寫onConfigurationChanged()方法,代碼如下:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
when (newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_YES -> {
// 暗黑模式已開啟
}
Configuration.UI_MODE_NIGHT_NO -> {
// 暗黑模式已關閉
}
}
}
我的辦法是通過recreate()重建界面來達到切換主題的,當然你也可以通過其他方式實作
項目位址:https://github.com/konstant2016/konstantTool/,歡迎 start