見出し画像

ダークテーマ「システムデフォルト」設定時の「ライト」「ダーク」を判別する方法|Kotlin|開発裏話

Android 10 未満の『CBnotes』では、以下 note で解説した通り、ダークテーマのオンとオフを切り替えるトグルスイッチを搭載しました。

Android 10 以上の『CBnotes』では、公式ガイド「ダークテーマ」の記載に則り、推奨のオプションを搭載しています。

Android 10 (API レベル 29) 以上で実行されている場合、推奨されるオプションは異なり、ユーザーがシステム デフォルトをオーバーライドできます。
・ライト
・ダーク
・システム デフォルト(推奨されるデフォルトのオプション)

画像1


迷い点

アプリでこの「システムデフォルト」を設定しているとき、つまり、設定アプリでダークテーマをオンかオフのどちらかに設定している場合、実際の設定テーマ「ライト」「ダーク」は、以下では取得できません。

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)アプリ開発を学習している方々には「参考教材」として、業務で動作実績のあるサンプルコード&開発環境一式が必要なプロの方々には「工数削減」として、大変にオススメです。


この記事が気に入ったらサポートをしてみませんか?