Android 适配Dark Theme(暗黑模式)

暗黑模式

在 2019 年的 Google I/O上,谷歌新发布的android 10终于从系统层级支持暗黑模式,那么为什么我们需要暗黑模式?Android开发者应该如何让自己的app适配暗黑模式?接下来的文章将一一为你解答。

为什么我们需要暗黑模式

在Android 官方文档中,列举了暗黑模式的三个好处:

  1. 可以大大降低功耗(取决于设备的屏幕技术)。
  2. 提高了弱视用户和对强光敏感的用户的可见性。
  3. 使任何人在昏暗的环境中都更容易使用设备。

在OLED显示屏上,当一个像素是纯黑色(十六进制为#000000)的时候,该像素将会被关闭并且不消耗能量,这时如果显示屏显示的是大面积的黑色像素,将会大大降低显示屏消耗的电量。

如何适配暗黑模式

Force Dark自动适配

Android 10 提供 Force Dark 功能。此功能可让开发者快速实现深色主题背景,只需要在 style.xml 中的应用主题中添加这一行代码android:forceDarkAllowed=“true” ,就可以完成自动适配。

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:forceDarkAllowed">true</item>
    </style>
</resources>

效果对比如下图所示。从结果来看,整体的界面风格好像确实变成了暗黑模式,但是菜单栏并未适配,所以这里我并不推荐你使用这种自动化的方式来实现深色主题,而是应该使用更加复杂一点的实现方式——自定义适配。

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

自定义适配

  1. 将App 使用的主题从之前默认的 Light 主题修改为 DayNight
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
</resources>
  1. 右击res目录 -> New -> Directory,创建一个values-night目录,然后右击values-night目录 -> New -> Values resource file,创建一个colors-night.xml文件。接着在这个文件中指定深色主题下的颜色值,颜色的命名要与colors.xml相同。
--colors.xml
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="colorTextView">#000</color>
</resources>

--colors-night.xml
<resources>
    <color name="colorPrimary">#303030</color>
    <color name="colorPrimaryDark">#232323</color>
    <color name="colorAccent">#008577</color>
    <color name="colorTextView">#FFFFFF</color>
</resources>
  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">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

override fun onConfigurationChanged(newConfig: Configuration) {
    val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
    when (currentNightMode) {
        Configuration.UI_MODE_NIGHT_NO -> {} // 夜间模式未启用,使用浅色主题
        Configuration.UI_MODE_NIGHT_YES -> {} // 夜间模式启用,使用深色主题
    }
}

还有一点需要注意的是,切换逻辑仅在运行时生效,当我们重新启动 App 的时候,会与当前系统设置的模式保持一致。

### 回答1: Android 开发中的暗黑模式是指应用程序可以根据用户的偏好在白天和黑夜之间切换视觉主题。 在暗黑模式下,应用程序的背景和文本颜色会变为深色,这样可以减少对眼睛的负担,特别是在夜间使用时。 要在 Android 应用程序中实现暗黑模式,需要在应用的主题中设置 `android:uiMode="night"` 属性。然后,您需要为应用的布局和资源创建暗黑主题的版本,并使用 `android:textAppearance` 和 `android:background` 等属性来设置文本颜色和背景颜色。 此外,您还可以使用 Android 系统的 `AppCompatDelegate.setDefaultNightMode` 方法来动态更改应用的主题,以响应用户的偏好设置。 例如,下面的代码演示了如何在应用的主题中启用暗黑模式: ``` <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Enable dark mode --> <item name="android:uiMode">night</item> </style> ``` 在布局文件中,您可以使用以下方式为文本设置暗黑模式样式: ``` <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:text="@string/hello_world" /> ``` 在资源文件中,您可以创建暗黑 ### 回答2: 暗黑模式是指在应用界面上以暗色调为主题的一种显示模式Android开发者可以通过在应用程序中添加暗黑模式的支持,使得用户可以根据自己的喜好选择使用暗黑模式。 在Android开发中,实现暗黑模式有多种方法。一种常见的方法是使用AppCompat库中的Theme.AppCompat.DayNight主题。这个主题会根据系统的暗黑模式开关自动切换应用的主题。开发者只需在res/values文件夹下创建一个styles.xml文件,并在其中定义一个DayNight主题即可。然后,可以根据需要在不同的布局文件中使用相应的主题来设置不同的界面样式。 另一种方法是使用Android Q(10.0)引入的系统暗黑模式API。开发者可以通过判断系统的暗黑模式状态,手动设置应用的主题。例如,可以在Activity的onCreate方法中通过调用AppCompatDelegate.setDefaultNightMode方法来设置应用的主题,然后通过调用recreate方法重启当前Activity使新主题生效。 开发者还可以通过自定义主题来实现暗黑模式。可以在styles.xml文件中定义一个自定义主题,并设置相应的颜色和样式。然后,使用这个自定义主题在应用的不同界面或组件中。 总的来说,Android开发暗黑模式主要是通过使用预定义的主题、系统提供的API,以及自定义主题来实现。开发者需要在应用中适配暗黑模式,并根据用户喜好提供界面切换的选项,以提升用户体验。 ### 回答3: 暗黑模式是一种为Android应用程序提供的外观主题选择,它通过使用深色背景和颜色调色板替代明亮的外观,以在低光环境下降低眼睛的疲劳并增强可阅读性。 Android开发者可以通过设置应用程序的主题样式为暗黑模式来实现这一功能。在Android系统中,可以使用AppCompat库中的Theme.AppCompat.DayNight主题来支持暗黑模式。这个主题根据系统的显示设置自动切换外观,根据时间或用户的系统显示模式选择浅色或深色主题。 在开发过程中,开发者可以通过使用AppCompat库中的特定工具方法来处理不同模式下的自定义主题。例如,通过使用getBoolean()方法来检查当前的主题模式,在代码中选择不同的样式或颜色。 除了提高可读性和降低眼睛疲劳,暗黑模式还可以为应用程序提供一个现代感和高级外观。它也可能有助于节省电池寿命,因为在AMOLED显示屏上,黑色背景可以显着地减少能量消耗。 然而,在实施暗黑模式时,开发者需要注意一些问题。首先,他们应该确保暗黑主题不会影响到应用程序的可用性和可访问性。其次,一些应用程序可能需要单独设计和调整,以适应深色主题下的特定需求,如图标和文本颜色。 总的来说,暗黑模式Android开发者带来了提供用户选择和提升应用程序外观的新的选择。通过合理的设计和实施,暗黑模式将为用户提供更好的体验并使应用程序更加吸引人。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值