Android 适配Dark Theme(暗黑模式)

本文介绍了如何自定义适配Android的Dark Theme,包括创建values-night目录设置深色主题颜色,以及为TextView等控件手动调整颜色。此外,还展示了如何在运行时通过getDelegate().setLocalNightMode()切换暗黑模式,提供了MODE_NIGHT_FOLLOW_SYSTEM、MODE_NIGHT_YES和MODE_NIGHT_NO等模式的解释。文章最后提到了在AndroidManifest中配置uiMode以避免Activity因主题变化而重新创建,并提到作者的Android开发经验及资料分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图1 正常情况
图2 Force Dark适配

自定义适配

  1. 将App 使用的主题从之前默认的 Light 主题修改为 DayNight
  1. 右击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

  1. 为那些在切换为暗黑模式时,需要改变颜色的控件适配,这里我们以TextView为例。

<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参数主要有以下值可供选择:

  1. MODE_NIGHT_FOLLOW_SYSTEM:默认模式,表示让当前应用程序跟随系统设置来决定使用浅色主题还是深色主题。

  2. MODE_NIGHT_YES:脱离系统设置,强制让当前应用程序使用深色主题。

  3. MODE_NIGHT_NO:脱离系统设置,强制让当前应用程序使用浅色主题

  4. MODE_NIGHT_AUTO_BATTERY:根据手机的电池状态来决定使用浅色主题还是深色主题,如果开启了节点模式,则使用深色主题。

需要注意的是,当调用setLocalNightMode()方法并成功切换主题时,应用程序中所有处于started状态的Activity都会被重新创建,那如果不想Activity重新创建Activity怎么切换主题呢?

这时候我们可以在AndroidManifest中将configChanges设置为uiMode,使当前的Activity避免被重新创建。

<application

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”

android:theme=“@style/AppTheme”>

现在当应用程序的主题发生变化时,MainActivity并不会重新创建,而是会触发onConfigurationChanged()方法的回调,你可以在回调当中手动做一些逻辑处理。

override fun onConfigurationChanged(newConfig: Configuration) {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

片转存中…(img-5CfL8g1a-1714958528487)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值