Tema gelap

Tema gelap tersedia dalam Android 10 (level API 29) dan lebih tinggi. Ini memiliki banyak manfaat:

  • Dapat mengurangi penggunaan daya dengan jumlah yang signifikan (tergantung teknologi layar perangkat).
  • Meningkatkan visibilitas bagi pengguna dengan penglihatan rendah dan mereka yang sensitif terhadap cahaya terang.
  • Membuatnya lebih mudah bagi siapa saja untuk menggunakan perangkat di lingkungan yang kurang cahaya.

Tema gelap berlaku untuk UI sistem Android dan aplikasi yang berjalan di perangkat.

Ada tiga cara untuk mengaktifkan tema Gelap di Android 10 (level API 29) dan lebih tinggi:

  • Gunakan setelan sistem (Pengaturan -> Tampilan -> Tema) untuk mengaktifkan tema Gelap.
  • Gunakan ubin Pengaturan Cepat untuk beralih tema dari baki notifikasi (setelah diaktifkan).
  • Pada perangkat Pixel, memilih mode Penghemat Baterai memungkinkan tema Gelap secara bersamaan. OEM lain mungkin mendukung atau mungkin tidak mendukung perilaku ini.

Mendukung tema Gelap di aplikasi Anda

Untuk mendukung tema Gelap, Anda harus menyetel tema aplikasi Anda (biasanya ditemukan di res/values/styles.xml) untuk diambil dari tema DayNight:

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

Anda juga dapat menggunakan tema gelap MaterialComponents:

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

Ini mengikat tema utama aplikasi ke flag mode malam yang dikontrol sistem dan memberi aplikasi tema Gelap default (saat diaktifkan).

Tema dan gaya

Tema dan gaya Anda harus menghindari warna atau ikon kode keras yang dimaksudkan untuk digunakan di bawah tema ringan. Anda harus menggunakan atribut tema (lebih disukai) atau sumber daya yang memenuhi syarat malam saja.

Berikut adalah dua atribut tema paling penting yang perlu diketahui:

  • ?android:attr/textColorPrimary Ini adalah warna teks tujuan umum. Hampir-hitam dalam tema Cahaya dan hampir-putih pada tema Gelap. Ini berisi status dinonaktifkan.
  • ?attr/colorControlNormal Warna ikon untuk keperluan umum. Ini berisi status dinonaktifkan.

Kami merekomendasikan penggunaan Komponen Desain Bahan, karena sistem pewarnaan warnanya (seperti atribut tema ?attr/colorSurface dan ?attr/colorOnSurface) menyediakan akses mudah ke warna yang sesuai. Tentu saja, Anda dapat menyesuaikan atribut ini dalam tema Anda.

Mengubah tema dalam aplikasi

Anda mungkin ingin mengizinkan pengguna untuk mengubah tema aplikasi saat aplikasi sedang berjalan. Aplikasi Anda dapat memungkinkan pengguna memilih di antara pilihan tema.

Saat berjalan di perangkat yang menjalankan Android 9 atau lebih lama, opsi tema yang disarankan adalah:

  • Terang
  • Gelap
  • Disetel oleh Penghemat Baterai (opsi default yang disarankan)

Saat berjalan pada Android 10 (level API 29) dan lebih tinggi, opsi yang disarankan berbeda, untuk memungkinkan pengguna menimpa default sistem:

  • Terang
  • Gelap
  • Default sistem (opsi default yang disarankan)

Perhatikan bahwa jika pengguna memilih Cahaya, maka Penghemat Baterai tidak akan mengubah setelan itu.

Setiap opsi memetakan langsung ke salah satu mode AppCompat.DayNight:

Untuk mengganti tema, panggil AppCompatDelegate.setDefaultNightMode().

Paksa Gelap

Android 10 menyediakan Paksa Gelap, fitur bagi pengembang untuk mengimplementasikan tema Gelap dengan cepat tanpa menetapkan tema DayNight secara eksplisit, seperti dijelaskan di atas.

Paksa Gelap menganalisis setiap tampilan aplikasi bertema cahaya Anda, dan menerapkan tema gelap secara otomatis sebelum ditarik ke layar. Beberapa pengembang menggunakan campuran implementasi Paksa Gelap dan asli untuk mengurangi jumlah waktu yang dibutuhkan untuk mengimplementasikan tema Gelap.

Aplikasi harus ikut serta ke Paksa Gelap dengan menyetel android:forceDarkAllowed="true" di tema aplikasi. Atribut ini disetel pada semua sistem dan AndroidX menyediakan tema-tema ringan, seperti Theme.Material.Light. Saat Anda menggunakan Paksa Gelap, Anda harus memastikan untuk menguji aplikasi Anda secara menyeluruh dan mengecualikan tampilan sesuai kebutuhan.

Jika aplikasi Anda menggunakan tema gelap (seperti Theme.Material), Paksa Gelap tidak akan diterapkan. Demikian pula, jika tema aplikasi Anda diturunkan dari tema DayNight, Paksa Gelap tidak akan diterapkan, karena pergantian tema otomatis.

Menonaktifkan Paksa Gelap pada tampilan

Paksa Gelap dapat dikontrol pada tampilan tertentu dengan atribut tata letak android:forceDarkAllowed atau dengan setForceDarkAllowed().

Praktik terbaik

Notifikasi dan Widget

Untuk permukaan UI yang Anda tampilkan di perangkat tetapi tidak mengontrol secara langsung, penting untuk memastikan bahwa setiap tampilan yang Anda gunakan mencerminkan tema aplikasi host. Dua contoh bagus adalah pemberitahuan dan widget peluncur.

Notifikasi

Gunakan templat pemberitahuan yang disediakan sistem (seperti MessagingStyle). Ini berarti bahwa sistem bertanggung jawab untuk memastikan gaya tampilan yang benar diterapkan.

Tampilan widget dan pemberitahuan kustom

Untuk widget peluncur, atau jika aplikasi Anda menggunakan tampilan konten notifikasi khusus, penting untuk memastikan Anda menguji konten pada kedua tema Terang dan Gelap.

Perangkap umum yang harus diperhatikan:

  • Dengan asumsi bahwa warna latar selalu terang
  • Warna teks hardcoding
  • Menyetel warna latar hardcoded, saat menggunakan warna teks standar
  • Menggunakan ikon yang dapat digambar yang merupakan warna statis

Dalam semua kasus ini, gunakan atribut tema yang sesuai alih-alih warna hardcoded.

Luncurkan layar

Jika aplikasi Anda memiliki layar peluncuran khusus, mungkin perlu dimodifikasi sehingga mencerminkan tema yang dipilih.

Hapus warna hardcoded, misalnya warna latar belakang yang menunjuk mungkin putih. Gunakan atribut tema ?android:attr/colorBackground sebagai gantinya.

Perhatikan bahwa drawable android:windowBackground bertema gelap hanya bekerja di Android Q.

Perubahan konfigurasi

Ketika tema aplikasi berubah (baik melalui setelan sistem atau AppCompat) itu memicu perubahan konfigurasi uiMode. Ini berarti bahwa Aktivitas akan dibuat ulang secara otomatis.

Dalam beberapa kasus, Anda mungkin ingin aplikasi menangani perubahan konfigurasi. Misalnya, Anda mungkin ingin menunda perubahan konfigurasi karena video diputar.

Sebuah aplikasi dapat menangani implementasi tema Gelap itu sendiri dengan menyatakan bahwa setiap Aktivitas dapat menangani perubahan konfigurasi uiMode:

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

Ketika suatu Aktivitas menyatakan ia menangani perubahan konfigurasi, metode onConfigurationChanged() akan dipanggil saat ada perubahan tema.

Untuk memeriksa apa tema saat ini, aplikasi dapat menjalankan kode seperti ini:

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;
}