實現Android應用的深色模式

深色模式,也稱為夜間模式或黑暗模式,具有比常規模式更低的亮度和更高的對比度。在晚上或灰暗的環境中使用深色模式可以減少眼睛疲勞,有利於保護眼睛健康。此外,深色模式還可以節省電量和延長電池壽命。因此,實現Android應用的深色模式已經是一個很有必要的功能。

一、Android的深色模式

Android 10 (API Level 29)中引入了深色主題(Dark Theme)API,讓 Android 應用程序能夠在日間模式和夜間模式之間進行切換,同時還支持不根據時間自動切換模式等功能。在深色模式下,Android 會應用適當的顏色主題來替換 APP 中淺色的背景和前景色。對於 Android 應用程序,只需在 res/values 下建立一個對應的 dark 文件夾,在裡面建立相同的 XML 文件,然後更改 AndroidManifest.xml 中的 android:theme.

二、應用的深色模式實現

深色模式可以通過兩種方式實現:手動設置和跟隨系統。不同的應用程序有不同的實現方式,但大致思路都相同,通過檢測系統主題的更改來觸發相應的樣式處理。下面提供一個簡單的示例,演示如何使用 AppCompat 庫實現應用的深色模式。

1. 設置主題

在 styles.xml 文件中定義一個名為 AppTheme 的主題,並繼承自 AppCompat 的日間主題。然後在 styles.xml (night) 文件中定義名為 AppDarkTheme 的主題,並繼承自 AppCompat 的深色主題。這樣,我們就有了日間和深色兩個主題。例如:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@color/background_light</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
    </style>

    <style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@color/background_dark</item>
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
    </style>
</resources>

2. 實現深色模式的開關按鈕

在應用的設置界面添加一個深色模式的開關按鈕。可以使用 Switch 按鈕,示例如下:

<Switch
    android:id="@+id/switchDarkMode"
    android:text="@string/switch_dark_mode"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/colorBlack"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

3. 觸發深色模式

使用以下代碼控制應用程序的深色模式:

switchDarkMode.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //檢測當前系統主題
        int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
        switch (currentNightMode) {
            case Configuration.UI_MODE_NIGHT_NO:
                // 切換到深色模式
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                break;
            case Configuration.UI_MODE_NIGHT_YES:
                // 切換到日間模式
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                break;
        }
        // 重啟該Activity以生效
        recreate();
    }
});

三、結語

深色模式可以給用戶帶來更好的使用體驗和更低的眼睛疲勞。開發人員應該考慮支持深色模式,並實現相應的切換機制。隨著 Android Q 中的深色主題 API 的出現,實現 Android 應用的深色模式變得更為容易。希望這篇文章可以為你實現深色模式提供一些幫助。

完整的代碼示例:

styles.xml:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@color/background_light</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
    </style>
</resources>

styles.xml (night):

<resources>
    <style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@color/background_dark</item>
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
    </style>
</resources>

主界面布局 activity_main.xml:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:text="@string/app_name"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>

    <TextView
        android:text="@string/hello_world"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>

    <Switch
        android:id="@+id/switchDarkMode"
        android:text="@string/switch_dark_mode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/colorBlack"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private Switch switchDarkMode;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        switchDarkMode = findViewById(R.id.switchDarkMode);

        switchDarkMode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //檢測當前系統主題
                int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                switch (currentNightMode) {
                    case Configuration.UI_MODE_NIGHT_NO:
                        // 切換到深色模式
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                        break;
                    case Configuration.UI_MODE_NIGHT_YES:
                        // 切換到日間模式
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                        break;
                }
                // 重啟該Activity以生效
                recreate();
            }
        });
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/308759.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-03 14:49
下一篇 2025-01-03 14:49

相關推薦

  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控制項。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟體設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • Android JUnit測試完成程序自動退出決方法

    對於一些Android JUnit測試的開發人員來說,程序自動退出是一個經常面臨的困擾。下面從多個方面給出解決方法。 一、檢查測試代碼 首先,我們應該仔細檢查我們的測試代碼,確保它…

    編程 2025-04-25

發表回復

登錄後才能評論