Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Tema gelap

Android Q menawarkan tema Gelap baru yang berlaku untuk UI sistem Android dan aplikasi yang berjalan di perangkat.

Tema gelap memiliki banyak keuntungan:

  • Dapat secara signifikan mengurangi penggunaan daya (bergantung teknologi layar perangkat).
  • Meningkatkan visibilitas bagi pengguna dengan gangguan penglihatan dan mereka yang sensitif terhadap cahaya terang.
  • Memudahkan penggunaan perangkat di lingkungan dengan sedikit cahaya.

Di Android Q, ada tiga cara untuk mengaktifkan tema Gelap:

  • Setelan sistem baru (Setelan -> Tampilan -> Tema) memungkinkan pengguna mengaktifkan tema Gelap.
  • Tile Setelan Cepat baru memungkinkan pengguna untuk mengganti tema dari baki notifikasi dengan cepat (setelah diaktifkan).
  • Pada perangkat Pixel, mode Penghemat Baterai juga dapat mengaktifkan tema Gelap di saat bersamaan. OEM lain mungkin dapat atau tidak mendukung perilaku ini.

Mendukung tema Gelap di aplikasi Anda

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

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

Anda juga dapat menggunakan tema gelap MaterialComponents:

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

Hal ini mengikat tema utama aplikasi ke tanda mode malam yang dikontrol sistem dan memberi aplikasi tema Gelap default (saat diaktifkan).

Tema dan gaya

Tema dan gaya Anda tidak boleh memiliki warna atau ikon hard code yang ditujukan untuk digunakan pada tema terang. Anda harus menggunakan atribut tema (lebih baik) atau resource yang memenuhi syarat untuk tema malam.

Berikut adalah dua atribut tema yang paling penting untuk diketahui:

  • ?android:attr/textColorPrimary Ini adalah warna teks untuk tujuan umum. Mendekati hitam dalam tema Terang dan mendekati putih pada tema Gelap. Atribut ini berisi status nonaktif.
  • ?attr/colorControlNormal Warna ikon untuk tujuan umum. Atribut ini berisi status nonaktif.

Sebaiknya gunakan Komponen Desain Material, karena sistem bertema warna miliknya (seperti atribut tema ?attr/colorSurface dan ?attr/colorOnSurface) menyediakan akses mudah ke warna yang sesuai. Tentunya, Anda dapat menyesuaikan atribut ini dalam tema Anda.

Mengubah tema dalam aplikasi

Anda mungkin ingin agar pengguna dapat mengubah tema aplikasi saat aplikasi sedang berjalan. Aplikasi Anda dapat memungkinkan pengguna memilih berbagai tema.

Saat berjalan di perangkat yang menjalankan Android 9 atau versi sebelumnya, opsi tema yang direkomendasikan adalah:

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

Saat berjalan di Android Q, opsi yang direkoemndaskan akan berbeda, agar pengguna dapat mengganti default sistem:

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

Perhatikan bahwa jika pengguna memilih Terang, Penghemat Baterai tidak akan mengubah setelan tersebut.

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

Untuk beralih tema, panggil AppCompatDelegate.setDefaultNightMode().

Force Dark

Android Q menyediakan Force Dark, sebuah fitur bagi developer untuk menerapkan tema Gelap dengan cepat tanpa menyetel tema DayNight secara eksplisit, seperti yang dijelaskan di atas.

Force Dark menganalisis setiap tampilan aplikasi bertema terang Anda, dan menerapkan tema gelap secara otomatis sebelum ditarik ke layar. Beberapa developer menggunakan kombinasi implementasi Force Dark dan native untuk mengurangi waktu yang dibutuhkan guna menerapkan tema Gelap.

Aplikasi harus menggunakan Force Dark dengan menyetel android:forceDarkAllowed="true" di tema aplikasi. Atribut ini disetel pada semua sistem dan AndroidX menyediakan tema-tema terang, seperti Theme.Material.Light. Saat menggunakan Force Dark, Anda harus memastikan untuk menguji aplikasi secara menyeluruh dan mengecualikan tampilan sebagaimana diperlukan.

Jika aplikasi Anda menggunakan tema gelap (seperti Theme.Material), Force Dark tidak akan diterapkan. Selain itu, jika tema aplikasi Anda diturunkan dari tema DayNight, Force Dark tidak akan diterapkan, dikarenakan pengalihan tema otomatis.

Menonaktifkan Force Dark pada tampilan

Force Dark dapat dikontrol pada tampilan spesifik dengan atribut tata letak android:forceDarkAllowed atau setForceDarkAllowed().

Praktik Terbaik

Notifikasi dan Widget

Untuk tampilan UI yang Anda tampilkan di perangkat tetapi tidak langsung dikontrol, penting untuk memastikan bahwa setiap tampilan yang Anda gunakan merefleksikan tema aplikasi host. Dua contoh yang tepat adalah notifikasi dan widget peluncur.

Notifikasi

Gunakan template notifikasi yang disediakan sistem (seperti MessagingStyle ). Artinya, sistem bertanggung jawab untuk memastikan penerapan gaya tampilan yang benar.

Tampilan widget dan notifikasi kustom

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

Kesalahan umum yang harus diperhatikan:

  • Menganggap bahwa warna latar selalu terang
  • Menggunakan warna teks hard code
  • Menyetel warna latar belakang hard code saat menggunakan warna teks default
  • Menggunakan ikon yang dapat digambar yang merupakan warna statis

Pada semua kasus di atas, gunakan atribut tema yang sesuai, bukan warna hard code.

Meluncurkan layar

Jika aplikasi Anda memiliki layar peluncuran kustom, aplikasi tersebut mungkin perlu dimodifikasi sehingga dapat merefleksikan tema yang dipilih.

Hapus semua warna hard code, misalnya warna latar belakang yang dapat mungkin berwarna putih. Gunakan atribut tema ?android:attr/colorBackground sebagai gantinya.

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

Perubahan konfigurasi

Ketika tema aplikasi diubah (melalui setelan sistem atau AppCompat), konfigurasi uiMode dapat berubah. Artinya, Aktivitas akan dibuat kembali secara otomatis.

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

Aplikasi dapat menangani implementasi tema Gelap sendiri dengan menyatakan bahwa setiap Aktivitas dapat menangani perubahan konfigurasi uiMode:

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

Jika Aktivitas menyatakan akan menangani perubahan konfigurasi, metode onConfigurationChanged()-nya akan dipanggil saat terdapat perubahan tema.

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

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