天天看點

Android Q 深色主題

從Support Library 23.2.0 開始,AppCompat 新增了主題:`Theme.AppCompat.DayNight`。其允許APP在 `深色主題` 和 `亮色主題` 之間切換;可以大幅減少耗電量(`OLED顯示屏`的裝置上,`深色主題`較`亮色主題` 有更加持久的續航能力);改善弱視以及對強光敏感的使用者的可視性;讓所有人都可以在光線較暗的環境中更輕松地使用裝置,進而提升使用者體驗。

Android Q 深色主題

了解深色主題如何應用,第一手資料是 官方文檔 與 相應的 官方 Sample

官方文檔:DayNight — Adding a dark theme to your app:

https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94

官方文檔:Dark theme:

https://developer.android.com/preview/features/darktheme

官方案例:android-DarkTheme

https://github.com/googlearchive/android-DarkTheme

一、深色主題簡介

從Support Library 23.2.0 開始,AppCompat 新增了主題:

Theme.AppCompat.DayNight

  • 其允許APP在

    深色主題

    亮色主題

    之間切換
  • 可以大幅減少耗電量(

    OLED顯示屏

    的裝置上,

    深色主題

    亮色主題

    有更加持久的續航能力)
  • 改善弱視以及對強光敏感的使用者的可視性
  • 讓所有人都可以在光線較暗的環境中更輕松地使用裝置,進而提升使用者體驗

而從Android Q(10.0)開始,Android設定中新增

深色主題背景

切換按鈕(設定-顯示-深色主題背景)。

Android Q 深色主題

是以Android App支援夜間模式,需提上開發日程了...

二、如何使用

2.1 主題設定

APP主題需繼承

Theme.AppCompat.DayNight

Theme.MaterialComponents.DayNight

,以下為代碼舉例。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
</style>
           

2.2 監聽Android Q 系統主題變化

若需要監聽系統主題,例如設定-顯示-深色主題背景 切換動作。

Activity添加

android:configChanges="uiMode"

<activity
        android:name=".MyActivity"
        android:configChanges="uiMode" />
           

Activity中重寫 onConfigurationChanged 方法

/**
 * Android系統設定中 "設定-顯示-深色主題背景" 切換後,回調該方法
 */
Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int mSysThemeConfig = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
    switch (mSysThemeConfig) {
	    // 亮色主題
        case Configuration.UI_MODE_NIGHT_NO:
            break;
        // 深色主題
        case Configuration.UI_MODE_NIGHT_YES:
            break;
    }
}
           

2.3 切換App主題

App 中切換應用主題,首先需調用

AppCompatDelegate.setDefaultNightMode(int mode)

方法,并調用

recreate()

方法使更改生效。

// 切換到 深色主題
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
// 需調用 recreate() ,進而使更改生效
recreate();
           

AppCompatDelegate.setDefaultNightMode(int mode)

方法有四個參數選項,具體介紹如下:

// 亮色主題
ThemeHelper.Mode.LIGHT
// 暗色主題
ThemeHelper.Mode.DARK
// 跟随 系統設定(系統深色模式,則深色模式;系統淺色模式,則淺色模式)
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
// 省電模式時 深色模式;非省點模式時 淺色模式
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
           

2.4 監聽App主題變化

若需要監聽App的主題變更,可重寫以下方法

/**
 * 回調目前應用的使用主題
 */
@Override
protected void onNightModeChanged(int mode) {
    super.onNightModeChanged(mode);
    switch (mode) {
		    // 亮色主題
        case AppCompatDelegate.MODE_NIGHT_NO:
            break;
            // 暗色主題
        case AppCompatDelegate.MODE_NIGHT_YES:
            break;
            // 省電模式時 深色模式;非省點模式時 淺色模式
        case AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY:
            break;
            // 跟随 系統設定(系統深色模式,則深色模式;系統淺色模式,則淺色模式)
        case AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:
            break;
    }
}
           

2.5 自定義背景顔色

  • 建立

    values-night

    檔案夾
    Android Q 深色主題
  • values/styles.xml

    拷貝到

    values-night/styles.xml

    values/styles.xml

    values-night/styles.xml

    主題代碼舉例如下

values/styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight">
        <!-- Customize your theme here. -->
    </style>
</resources>
           

values-night/styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
    </style>
</resources>
           
  • values/colors.xml

    values-night/colors.xml

    更改

    test_text_bg

    屬性的顔色值

values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">@android:color/white</color>
    <color name="test_layout_bg">@android:color/white</color>
    <color name="test_text">@android:color/black</color>
    <color name="test_text_bg">#008577</color>
</resources>
           

values-night/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">@android:color/black</color>
    <color name="test_layout_bg">@android:color/black</color>
    <color name="test_text">@android:color/white</color>
    <color name="test_text_bg">#D81B60</color>
</resources>
           

三、OK 完事大吉

案例源碼下載下傳位址:

https://github.com/AndroidAppCodeDemo/Android_Dark_Test

Android Q 深色主題
Android Q 深色主題

= THE END =

文章首發于公衆号”CODING技術小館“,如果文章對您有幫助,可關注我的公衆号。

Android Q 深色主題