ธีมมืดพร้อมใช้งานใน 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">
ซึ่งจะเชื่อมโยงธีมหลักของแอปกับ Flag โหมดกลางคืนที่ระบบควบคุม และทำให้แอปมีธีมมืดเริ่มต้นเมื่อเปิดใช้
ธีมและสไตล์
หลีกเลี่ยงการใช้สีหรือไอคอนที่กำหนดไว้ล่วงหน้าสำหรับธีมแสง ให้ใช้แอตทริบิวต์ธีมหรือทรัพยากรที่เหมาะสำหรับช่วงกลางคืนแทน
แอตทริบิวต์ของธีม 2 รายการที่สำคัญที่สุดสำหรับธีมมืดมีดังนี้
?android:attr/textColorPrimary
: สีข้อความสำหรับวัตถุประสงค์ทั่วไป โดยไอคอนจะมีลักษณะเกือบดำในธีมสว่างและเกือบขาวในธีมมืด โดยมีสถานะ "ปิดใช้"?attr/colorControlNormal
: สีของไอคอนสำหรับจุดประสงค์ทั่วไป มีสถานะ "ปิดใช้"
เราขอแนะนำให้ใช้คอมโพเนนต์ดีไซน์ Material เนื่องจากระบบธีมสี เช่น แอตทริบิวต์ของธีม ?attr/colorSurface
และ ?attr/colorOnSurface
จะช่วยให้เข้าถึงสีที่เหมาะสมได้ง่าย คุณปรับแต่งแอตทริบิวต์เหล่านี้ได้ในธีม
เปลี่ยนธีมในแอป
คุณอนุญาตให้ผู้ใช้เปลี่ยนธีมของแอปขณะที่แอปทำงานอยู่ได้ ตัวเลือกที่แนะนำมีดังนี้
- น้อย
- มืด
- ค่าเริ่มต้นของระบบ (ตัวเลือกเริ่มต้นที่แนะนำ)
ตัวเลือกเหล่านี้จับคู่กับ AppCompat.DayNight
โหมดโดยตรง
ไฟ:
MODE_NIGHT_NO
มืด:
MODE_NIGHT_YES
ค่าเริ่มต้นของระบบ:
MODE_NIGHT_FOLLOW_SYSTEM
หากต้องการเปลี่ยนธีม ให้ทำดังนี้
ใน API ระดับ 31 ขึ้นไป ให้ใช้
UiModeManager#setApplicationNightMode
เพื่อแจ้งให้ระบบทราบว่าแอปของคุณใช้ธีมใด วิธีนี้ช่วยให้ระบบจับคู่ธีมระหว่างหน้าจอแนะนำได้ใน API ระดับ 30 หรือต่ำกว่า ให้ใช้
AppCompatDelegate.setDefaultNightMode()
เพื่อเปลี่ยนธีม
บังคับใช้โหมดมืด
Android 10 มี Force Dark ซึ่งเป็นฟีเจอร์ที่ช่วยให้นักพัฒนาแอปใช้ธีมมืดได้อย่างรวดเร็วโดยไม่ต้องตั้งค่าธีม DayNight
อย่างชัดเจน
โหมดบังคับใช้ธีมมืดจะวิเคราะห์มุมมองแต่ละมุมมองของแอปธีมสว่างและใช้ธีมมืดโดยอัตโนมัติก่อนที่จะแสดงบนหน้าจอ คุณสามารถใช้ทั้งการบังคับใช้ธีมมืดและการใช้งานแบบเนทีฟเพื่อลดเวลาในการใช้งานธีมมืด
แอปต้องเลือกใช้ "บังคับใช้ธีมมืด" โดยการตั้งค่า android:forceDarkAllowed="true"
ในธีมของกิจกรรม แอตทริบิวต์นี้กำหนดไว้ในธีมแสงทั้งหมดที่ระบบและ AndroidX มีให้ เช่น Theme.Material.Light
เมื่อใช้ตัวเลือก "บังคับใช้โหมดมืด" ให้ทดสอบแอปอย่างละเอียดและยกเว้นมุมมองตามต้องการ
หากแอปใช้ธีมมืด เช่น Theme.Material
) ระบบจะไม่บังคับใช้ธีมมืด ในทํานองเดียวกัน หากธีมของแอปรับค่ามาจากธีม DayNight
ระบบจะไม่ใช้ "บังคับใช้ธีมมืด" เนื่องจากมีการสลับธีมโดยอัตโนมัติ
ปิดใช้ฟีเจอร์บังคับมืดในมุมมอง
คุณสามารถควบคุมโหมดมืดในบางมุมมองได้ด้วยแอตทริบิวต์android:forceDarkAllowed
เลย์เอาต์หรือsetForceDarkAllowed()
เนื้อหาเว็บ
โปรดดูข้อมูลเกี่ยวกับการใช้ธีมมืดในเนื้อหาบนเว็บที่หัวข้อปรับเนื้อหาบนเว็บให้มืดลงใน WebView ดูตัวอย่างธีมมืดที่ใช้กับ WebView ได้ที่การสาธิต WebView บน GitHub
แนวทางปฏิบัติแนะนำ
ส่วนต่อไปนี้แสดงแนวทางปฏิบัติแนะนำในการใช้ธีมมืด
การแจ้งเตือนและวิดเจ็ต
สำหรับแพลตฟอร์ม UI ที่คุณแสดงในอุปกรณ์แต่ไม่ได้ควบคุมโดยตรง ให้ตรวจสอบว่ามุมมองที่คุณใช้แสดงธีมของแอปโฮสต์ ตัวอย่าง 2 อย่าง ได้แก่ การแจ้งเตือนและวิดเจ็ตตัวเปิด
การแจ้งเตือน
ใช้เทมเพลตการแจ้งเตือนที่ระบบมีให้ เช่น MessagingStyle
ซึ่งหมายความว่าระบบจะเป็นผู้รับผิดชอบในการใช้การจัดรูปแบบมุมมองที่ถูกต้อง
วิดเจ็ตและมุมมองการแจ้งเตือนที่กำหนดเอง
สำหรับวิดเจ็ตตัวเปิดแอป หรือหากแอปของคุณใช้มุมมองเนื้อหาการแจ้งเตือนที่กำหนดเอง ให้ทดสอบเนื้อหาทั้งในธีมแสงและธีมสีเข้ม
ข้อผิดพลาดที่พบบ่อยซึ่งควรระวังมีดังนี้
- สมมติว่าสีพื้นหลังเป็นสีอ่อนเสมอ
- สีข้อความแบบฮาร์ดโค้ด
- การตั้งค่าสีพื้นหลังแบบฮาร์ดโค้ดโดยใช้สีข้อความเริ่มต้น
- การใช้ไอคอนที่วาดได้ซึ่งมีสีคงที่
ในทุกกรณีเหล่านี้ ให้ใช้แอตทริบิวต์ธีมที่เหมาะสมแทนการกำหนดสีแบบฮาร์ดโค้ด
หน้าจอเรียกใช้
หากแอปมีหน้าจอเปิดใช้งานที่กำหนดเอง คุณอาจต้องแก้ไขหน้าจอให้แสดงธีมที่เลือกไว้
นำสีที่กำหนดไว้อย่างเข้มงวดออก เช่น สีพื้นหลังที่กำหนดเป็นสีขาวแบบเป็นโปรแกรม ให้ใช้แอตทริบิวต์ธีม ?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; }