#はじめに
Android10よりDarkThemeを適用することで、バッテリーの消費を抑えるなどの効果が得られるようになりました。
本稿ではDarkThemeへの対応方法を説明します。
#DarkTheme対応
DarkTheme対応方法を下記に示します。
###style
<!--AppCompat-->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<!--MaterialComponent-->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
AppCompatのスタイルを使う時はres/values/styles.xmlにDayNightテーマを記述して使います。
また、MaterialComponentのスタイルを使うこともできます(com.google.android.material:material:1.1.0-alpha1から)
以上でシステムの設定によりDarkまたはLightのスタイルがアプリに適用されます。
###強制的にDarkThemeを設定する
//DarkTheme適用
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
//LightTheme適用
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
AppCompatDelegate.setDefaultNightMode()を呼ぶことで意図的にThemeを設定することができます。
また、この設定を変えたイベントはconfigChangesで受け取ることができます。
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
//現在のThemeを取得
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
Configuration.UI_MODE_NIGHT_NO -> {
//LightThemeの場合
}
Configuration.UI_MODE_NIGHT_YES -> {
//DarkThemeの場合
}
}
}
###resourceフォルダの使いわけ
通常とは別にDarkTheme用のリソースを定義したい場合はvresフォルダにalues-nightのように-nightを付けた名前のフォルダを定義して、リソースを設定しておくことでDarkThemeが適用された時にそのリソースが使われます。