ダークテーマ「システムデフォルト」設定時の「ライト」「ダーク」を判別する方法|Kotlin|開発裏話
Android 10 未満の『CBnotes』では、以下 note で解説した通り、ダークテーマのオンとオフを切り替えるトグルスイッチを搭載しました。
Android 10 以上の『CBnotes』では、公式ガイド「ダークテーマ」の記載に則り、推奨のオプションを搭載しています。
Android 10 (API レベル 29) 以上で実行されている場合、推奨されるオプションは異なり、ユーザーがシステム デフォルトをオーバーライドできます。
・ライト
・ダーク
・システム デフォルト(推奨されるデフォルトのオプション)
迷い点
アプリでこの「システムデフォルト」を設定しているとき、つまり、設定アプリでダークテーマをオンかオフのどちらかに設定している場合、実際の設定テーマ「ライト」「ダーク」は、以下では取得できません。
AppCompatDelegate.getDefaultNightMode()
これでは、「システムデフォルト」が取得されてしまい、「ライト」「ダーク」のどちらの状態になっているのか、プログラム的に判別ができません。
その正しい判別方法は、公式ガイドに記載されています。
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
}
しかし、この方法、注意が必要です。
実装上の重要な注意点
『CBnotes』を開発中に遭遇した問題だったのですが、アプリケーションコンテキストからは、uiMode を正常に取得することができません。常に不正な設定値が取得されてしまいます。
『CBnotes』における実装
正しくは、アクティビティコンテキストから参照する必要があります。
以下の「context」を、アプリケーションコンテキストにしてはいけません。
fun isNightMode(): Boolean {
return when (context!!.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_YES -> true
Configuration.UI_MODE_NIGHT_NO -> false
Configuration.UI_MODE_NIGHT_UNDEFINED -> false
else -> false
}
}
『CBnotes』ソースコード一式
以下 note で、実際に Google Play へ公開リリースしている『CBnotes』のソースコード一式を販売しております。
Android(Kotlin)アプリ開発を学習している方々には「参考教材」として、業務で動作実績のあるサンプルコード&開発環境一式が必要なプロの方々には「工数削減」として、大変にオススメです。