Android Dark Theme
Dark theme, Google I/O 2019 ile birlikte Android 10 (API düzeyi 29) sürümüyle beraber hayatımıza girdi.
Peki bize sağladığı avantajlar nelerdir?
- Güç kullanımını önemli ölçüde azaltabilir. (tabi cihazın ekran teknolojisine bağlı olduğunu da atlamamak gerekir)
- Parlak ışığa duyarlı kullanıcılar için görünürlüğü iyileştirir.
- Cihazın düşük ışıklı bir ortamda kullanmasını kolaylaştırır.
Dark modu etkinleştirmenin 3 yolu var.
- Ayarlar -> Ekran -> Tema -> Koyu Tema’yı seçin.
- Bildirim ekranından Hızlı Ayarlar kutucuğundan geçiş yapabilirsiniz.
- Pixel cihazlarda Pil Tasarrufu modunun seçilmesi aynı zamanda Koyu temayı da etkinleştirir.
Uygulamanızda Dark Modu Destekleme
Dark modu desteklemek için uygulamamızın temasını bir DayNight temasından genişletilmesi gerekir.
Support Library kullanıyorsanız;<style name="AppTheme" parent="Theme.AppCompat.DayNight">MaterialComponent Kullanıyorsanız;<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Bunu ayarladığınızda, uygulamaya cihazın varsayılan teması uygulanır.
Aslında bu kadar basit. Fakat şöyle bir ayrıntıyı göz önünde bulundurmak gerekir. Bu yöntem ile uygulamamızın dark moda geçmesini istiyorsanız, viewlara sabit renk kodları vermememiz gerekiyor. Yani uygulamadaki view renklerinin örnek olarak aşağıda görmüş olduğunuz tema dosyasındaki attributelerden beslenmiş olması gerekir.
Fakat geniş kapsamlı uygulamalar için bu pek mümkün değil. Peki o zaman uygulamalarımıza nasıl dark modu implement edeceğiz? Bu durumda en hızlı çözüm “Force Dark” özelliğini kullanmak olacaktır. Nedir Force Dark, detaylı inceleyelim.
Force Dark (Dark Moda Zorla)
Android 10 ve üzeri sürümlerde, bir DayNight teması ayarlamadan uygulamalarımızı kolayca dark moda geçirebiliriz. Bunu uygulamak için “forceDarkAllowed” seçeneğini true olarak ayarlamamız gerekir.
Fakat “Force Dark” özelliği ile uygulamamızı sadece temel düzeyde Karanlık Mod’a uyarladığını da göz önünde bulundurmak gerekir. Force Dark, açık temalı uygulamamızın her görünümünü analiz eder ve ekrana çizilmeden önce otomatik olarak koyu bir tema uygular.
Not: Uygulamanız koyu bir tema kullanıyorsa, Force Dark uygulanmaz. Benzer şekilde, uygulamanızın teması bir DayNight temasından genişletilmişse, otomatik tema geçişi nedeniyle Force Dark uygulanmaz.
Force Dark özelliğini kullanmak en kolay yol olsa da uygulamamızda karanlık mod için kullanmak istediğimiz renk kodlarına kendimiz karar veremiyoruz ve en önemlisi Android Q altındaki sürümlere destek veremiyoruz. Bu sebep ile force dark yerine dark ve light mod için kendi oluşturacağımız color, style, dimension vs. resource’sları kullanarak uygulama içi tema değiştirme özelliğini uygulamalarımıza eklemek daha doğru olacaktır. Bu sayede neyin nasıl görünmesi gerektiğini daha iyi yönetebilir ve en önemlisi Android Q altındaki sürümlere destek verebiliriz.
Uygulama İçi Tema Değiştirmek
Uygulama içi tema değiştirmek için birkaç seçenek mevcut. Seçenekler şunlar:
- Light —
MODE_NIGHT_NO
(Light temayı kullanmayı sağlar.) - Dark —
MODE_NIGHT_YES
(Dark temayı kullanmayı sağlar.) - System default —
MODE_NIGHT_FOLLOW_SYSTEM
(Cihazda tanımlı olan temayı kullanmayı sağlar)
Kullanıcının uygulamanızda seçtiği temayı uygulamak için AppCompatDelegate.setDefaultNightMode() methodunu kullanmanız gerekir.
Not: AppCompat v1.1.0 ile başlayarak setDefaultNightMode(), başlatılan tüm activityleri otomatik olarak yeniden oluşturur.
Günümüz uygulamalarında genelde uygulama ayarları kısmında tema seçimi alanı olur. Biz de benzer bir örnek yaparak ilerleyelim. Kullanıcının seçimine göre temayı setleyeceğimiz basit bir app geliştireceğiz.
Bunu yapmak için önce dark modda kullanılacak renk kodları için ‘colors.xml(night)’ resource’sunu ekliyoruz. Light moddaki renk kodlarının dark mod karşılıklarını ekliyoruz. Eklediğiniz color’ın aynı name ile tanımlanmış olmasına dikkat edin. Color dosyalarının aşağıdaki şekilde çoklanmış olduğunuz görmelisiniz.
Not: Style, drawable vb. kaynaklarınızın da dark moda özel karşılıkları var ise onlarında night karşılıklarını color.xml’de yaptığımıza benzer şekilde eklemelisiniz.
Bir radio grup ekleyip, tema seçenekleri için radio butonlar ve örnek olması açısındanda renkli butonlar ekledim.
Kullanıcı uygulamayı kapatıp tekrar açtığında app’i daha önce setlemiş olduğu temaya uygun olarak açabilmemiz için seçilen temayı sharedPreferences’a kaydetmeliyiz. Kullanıcı app’i açtığında daha önce kaydedilmiş olan temayı okuyup setliyoruz. Günümüzdeki app’leri düşünün mesela, bir kere ayarlardan seçimimizi yapıyoruz ve sonrasında app her zaman seçimize uygun açılıyor :)
Kullanıcı temayı değiştirdiğinde ise seçmiş olduğu yeni temayı uygulayıp aynı zamanda tekrar sharedPreferences’a kaydediyoruz.
İşte bu kadar :)
Projenin kaynak kodlarına aşağıdaki linkten ulaşabilirsiniz.