安卓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()重建界面来达到切换主题的,当然你也可以通过其他方式实现
项目地址:GitHub - konstant2016/konstantTool: 菜籽工具箱源码,项目代码主要在tool文件夹下,其他地方都是些杂乱代码,欢迎 start