ใช้ธีมมืด

ลองใช้ Compose
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีทำงานกับการกำหนดธีมใน Compose

รูปที่ 1 ธีมมืด

ธีมมืดพร้อมใช้งานใน Android 10 (API ระดับ 29) ขึ้นไป โดยมี ประโยชน์ดังนี้

  • ลดการใช้พลังงานได้มาก ทั้งนี้ขึ้นอยู่กับเทคโนโลยีหน้าจอของอุปกรณ์
  • ปรับปรุงระดับการเข้าถึงสำหรับผู้ใช้ที่มีสายตาเลือนรางและผู้ที่ไวต่อ แสงจ้า
  • ช่วยให้ใช้อุปกรณ์ในสภาพแวดล้อมที่มีแสงน้อยได้ง่ายขึ้น

ธีมสีเข้มจะมีผลกับ UI ของระบบ Android และแอปที่ทำงานในอุปกรณ์

คุณเปิดใช้ธีมมืดใน Android 10 ขึ้นไปได้ 3 วิธี ดังนี้

  • ใช้การตั้งค่าระบบโดยไปที่การตั้งค่า > จอแสดงผล > ธีมเพื่อเปิดใช้ธีมมืด
  • ใช้การ์ดการตั้งค่าด่วนเพื่อเปลี่ยนธีมจากถาดการแจ้งเตือน เมื่อเปิดใช้
  • ในอุปกรณ์ Pixel ให้เปิดใช้โหมดประหยัดแบตเตอรี่เพื่อเปิดใช้ธีมมืดพร้อมกัน อุปกรณ์อื่นๆ อาจไม่รองรับการทำงานนี้

ดูวิธีการใช้ธีมมืดกับเนื้อหาบนเว็บโดยใช้คอมโพเนนต์ WebView ได้ที่ทำให้เนื้อหาเว็บใน WebView เป็นสีเข้ม

รองรับธีมมืดในแอป

หากต้องการรองรับธีมมืด ให้ตั้งค่าธีมของแอป ซึ่งมักจะอยู่ใน res/values/styles.xml—ให้รับค่าจากธีม DayNight

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

นอกจากนี้ คุณยังใช้ธีมมืดของ Material Components ได้ด้วย

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

ซึ่งจะเชื่อมโยงธีมหลักของแอปกับค่าสถานะโหมดกลางคืนที่ระบบควบคุม และ ทำให้แอปมีธีมมืดเริ่มต้นเมื่อเปิดใช้

ธีมและสไตล์

หลีกเลี่ยงการใช้สีหรือไอคอนที่ฮาร์ดโค้ดซึ่งมีไว้สำหรับใช้ในธีมสว่าง ให้ใช้แอตทริบิวต์ธีมหรือทรัพยากรที่ระบุสำหรับโหมดกลางคืนแทน

แอตทริบิวต์ธีม 2 รายการที่สำคัญที่สุดสำหรับธีมมืดมีดังนี้

  • ?android:attr/textColorPrimary: สีข้อความทั่วไป โดยจะเป็นสีดำเกือบสนิทในธีมสว่างและสีขาวเกือบสนิทในธีมมืด มีสถานะ ปิดใช้
  • ?attr/colorControlNormal: สีไอคอนอเนกประสงค์ มีสถานะ ปิดใช้

เราขอแนะนำให้ใช้ Material Design Components เนื่องจากระบบ การกำหนดธีมสี เช่น แอตทริบิวต์ธีม ?attr/colorSurface และ ?attr/colorOnSurface ช่วยให้เข้าถึงสีที่เหมาะสมได้ง่าย คุณปรับแต่งแอตทริบิวต์เหล่านี้ได้ในธีม

เปลี่ยนธีมในแอป

คุณอนุญาตให้ผู้ใช้เปลี่ยนธีมของแอปได้ขณะที่แอปกำลังทำงาน ตัวเลือกที่แนะนำมีดังนี้

  • น้อย
  • มืด
  • ค่าเริ่มต้นของระบบ (ตัวเลือกเริ่มต้นที่แนะนำ)

ตัวเลือกเหล่านี้จะเชื่อมโยงกับAppCompat.DayNightโหมดโดยตรง

หากต้องการเปลี่ยนธีม ให้ทำดังนี้

  • ใน API ระดับ 31 ขึ้นไป ให้ใช้ UiModeManager#setApplicationNightMode เพื่อให้ระบบทราบว่าแอปของคุณใช้ธีมใด ซึ่งจะช่วยให้ระบบจับคู่ธีม ระหว่างหน้าจอเริ่มต้นได้

  • ใน API ระดับ 30 และต่ำกว่า ให้ใช้ AppCompatDelegate.setDefaultNightMode() เพื่อเปลี่ยนธีม

บังคับใช้ธีมมืด

Android 10 มีบังคับใช้ธีมมืด ซึ่งเป็นฟีเจอร์สำหรับนักพัฒนาแอปที่ช่วยให้ ใช้ธีมมืดได้อย่างรวดเร็วโดยไม่ต้องตั้งค่าธีมDayNightอย่างชัดเจน

Force Dark จะวิเคราะห์แต่ละมุมมองของแอปธีมสว่างและใช้ธีมมืดโดยอัตโนมัติก่อนที่จะวาดลงบนหน้าจอ คุณสามารถใช้การผสมผสานระหว่าง Force Dark และการใช้งานเนทีฟเพื่อลดเวลาที่ต้องใช้ในการใช้งานดาร์ก ธีม

แอปต้องเลือกใช้ Force Dark โดยการตั้งค่า android:forceDarkAllowed="true" ในธีมของกิจกรรม แอตทริบิวต์นี้ตั้งค่าไว้ในธีมสีอ่อนทั้งหมดที่ระบบและ AndroidX มีให้ เช่น Theme.Material.Light เมื่อใช้ Force Dark ให้ทดสอบแอปอย่างละเอียดและยกเว้นมุมมองตามที่จำเป็น

หากแอปใช้ธีมมืด เช่น Theme.Material) ระบบจะไม่ใช้ Force Dark ในทำนองเดียวกัน หากธีมของแอปสืบทอดมาจากธีม DayNight Force Dark จะไม่ได้รับการใช้เนื่องจากการสลับธีมโดยอัตโนมัติ

ปิดใช้บังคับใช้ธีมมืดในมุมมอง

คุณควบคุม Force Dark ได้ในมุมมองที่เฉพาะเจาะจงด้วยแอตทริบิวต์เลย์เอาต์ android:forceDarkAllowed หรือด้วย setForceDarkAllowed()

เนื้อหาเว็บ

ดูข้อมูลเกี่ยวกับการใช้ธีมมืดในเนื้อหาบนเว็บได้ที่ทำให้เนื้อหาเว็บใน WebView มืดลง ดูตัวอย่างธีมมืดที่ใช้กับ WebView ได้ที่การสาธิต WebView ใน GitHub

แนวทางปฏิบัติแนะนำ

ส่วนต่อไปนี้จะแสดงแนวทางปฏิบัติแนะนำสำหรับการใช้ธีมมืด

การแจ้งเตือนและวิดเจ็ต

สำหรับแพลตฟอร์ม UI ที่คุณแสดงในอุปกรณ์แต่ไม่ได้ควบคุมโดยตรง ให้ตรวจสอบว่ามุมมองใดก็ตามที่คุณใช้แสดงธีมของแอปโฮสต์ ตัวอย่างเช่น การแจ้งเตือนและวิดเจ็ต Launcher

การแจ้งเตือน

ใช้เทมเพลตการแจ้งเตือนที่ระบบมีให้ เช่น MessagingStyle ซึ่งหมายความว่าระบบมีหน้าที่รับผิดชอบในการใช้สไตล์การดูที่ถูกต้อง

วิดเจ็ตและมุมมองการแจ้งเตือนที่กำหนดเอง

สำหรับวิดเจ็ตตัวเรียกใช้ หรือหากแอปใช้มุมมองเนื้อหาการแจ้งเตือนที่กำหนดเอง ให้ทดสอบเนื้อหาในธีมสว่างและธีมมืด

ข้อผิดพลาดที่พบบ่อยซึ่งควรระวังมีดังนี้

  • สมมติว่าสีพื้นหลังเป็นสีอ่อนเสมอ
  • การฮาร์ดโค้ดสีข้อความ
  • การตั้งค่าสีพื้นหลังที่ฮาร์ดโค้ดขณะใช้สีข้อความเริ่มต้น
  • การใช้ไอคอน Drawable ที่เป็นสีแบบคงที่

ในทุกกรณีเหล่านี้ ให้ใช้แอตทริบิวต์ธีมที่เหมาะสมแทนสีที่ฮาร์ดโค้ด

หน้าจอเปิดแอป

หากแอปมีหน้าจอเปิดที่กำหนดเอง คุณอาจต้องแก้ไขเพื่อให้หน้าจอเปิด แสดงธีมที่เลือก

นำสีที่ฮาร์ดโค้ดออก เช่น สีพื้นหลังที่ตั้งค่าโดยใช้โปรแกรมเป็นสีขาว ให้ใช้แอตทริบิวต์ธีม ?android:attr/colorBackground แทน

การเปลี่ยนแปลงการกำหนดค่า

เมื่อธีมของแอปเปลี่ยนไป ไม่ว่าจะผ่านการตั้งค่าระบบหรือ AppCompat ระบบจะทริกเกอร์การเปลี่ยนแปลงการกำหนดค่า uiMode ซึ่งหมายความว่าระบบจะสร้างกิจกรรมขึ้นใหม่โดยอัตโนมัติ

ในบางกรณี คุณอาจต้องการให้แอปจัดการการเปลี่ยนแปลงการกำหนดค่า เช่น คุณอาจต้องการเลื่อนการเปลี่ยนแปลงการกำหนดค่าเนื่องจากวิดีโอกำลังเล่นอยู่

แอปสามารถจัดการการใช้งานธีมมืดได้โดยประกาศว่าแต่ละ Activity สามารถจัดการการเปลี่ยนแปลงการกำหนดค่า uiMode ได้

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

เมื่อ Activity ประกาศว่าจัดการการเปลี่ยนแปลงการกำหนดค่าได้ ระบบจะเรียกใช้เมธอด onConfigurationChanged() เมื่อมีการเปลี่ยนแปลงธีม

หากต้องการตรวจสอบว่าธีมปัจจุบันคืออะไร แอปสามารถเรียกใช้โค้ดต่อไปนี้

Kotlin

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme.
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme.
}

Java

int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}