Android 10 提供 Force Dark 功能。此功能可让开发者快速实现深色主题背景,只需要在 style.xml 中的应用主题中添加这一行代码android:forceDarkAllowed=“true” ,就可以完成自动适配。
效果对比如下图所示。从结果来看,整体的界面风格好像确实变成了暗黑模式,但是菜单栏并未适配,所以这里我并不推荐你使用这种自动化的方式来实现深色主题,而是应该使用更加复杂一点的实现方式——自定义适配。
|
|
|
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
开源分享完整内容戳这里
img.cn/20200609234059150.png">图2 Force Dark适配
自定义适配- 将App 使用的主题从之前默认的 Light 主题修改为 DayNight
- 右击res目录 -> New -> Directory,创建一个values-night目录,然后右击values-night目录 -> New -> Values resource file,创建一个colors-night.xml文件。接着在这个文件中指定深色主题下的颜色值,颜色的命名要与colors.xml相同。
–colors.xml
#008577
#00574B
#D81B60
#000
–colors-night.xml
#303030
#232323
#008577
#FFFFFF
- 为那些在切换为暗黑模式时,需要改变颜色的控件适配,这里我们以TextView为例。
android:id="@+id/name" android:layout_width=“wrap_content” android:layout_height=“wrap_content” android:textColor="@color/colorTextView" android:padding=“10dp” android:textSize=“20sp” app:layout_constraintLeft_toLeftOf=“parent” app:layout_constraintTop_toTopOf=“parent” /> 效果对比如下图。效果明显比自动适配好上不少,算是初步实现了对暗黑模式的适配。 手动切换暗黑模式 目前为止我们已经知道了如何适配暗黑模式,在完成适配之后,我们还需要为用户提供在运行时,切换主题的选项,切换的代码也很简单,在菜单监听中通过getDelegate().setLocalNightMode()来设置当前的模式。 @Override public boolean onOptionsItemSelected(MenuItem mi){ if(mi.isCheckable()){ mi.setChecked(true); } switch (mi.getItemId()){ case R.id.mode_light: getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO); break; case R.id.mode_dark: getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES); break; case R.id.mode_system: getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); break; } return true; } setLocalNightMode()方法接收一个mode参数,用于控制当前应用程序的夜间模式。mode参数主要有以下值可供选择: MODE_NIGHT_FOLLOW_SYSTEM:默认模式,表示让当前应用程序跟随系统设置来决定使用浅色主题还是深色主题。 MODE_NIGHT_YES:脱离系统设置,强制让当前应用程序使用深色主题。 MODE_NIGHT_NO:脱离系统设置,强制让当前应用程序使用浅色主题 MODE_NIGHT_AUTO_BATTERY:根据手机的电池状态来决定使用浅色主题还是深色主题,如果开启了节点模式,则使用深色主题。 需要注意的是,当调用setLocalNightMode()方法并成功切换主题时,应用程序中所有处于started状态的Activity都会被重新创建,那如果不想Activity重新创建Activity怎么切换主题呢? 这时候我们可以在AndroidManifest中将configChanges设置为uiMode,使当前的Activity避免被重新创建。
android:allowBackup=“true” android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl=“true” android:configChanges=“uiMode”



