こんにちは、ネイティブアプリ開発を担当している杉山です。
今回は、Android 10 から利用可能となった「ダークテーマ」のお話です。
ダークテーマとは
Android 10 から利用可能となった黒基調の UI です。
ダークテーマのメリット
- 電力消費を節約!
- 視覚障がいのある方、明るい光が苦手な方にとって見やすさ向上!
ダークテーマを使う
1. アプリのテーマに DayNight Theme を継承させる
/res/values/styles.xml にて以下の設定を行う。
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
MaterialComponents のダークテーマも利用可能です。
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
2. リソースディレクトリを切り分ける
修飾子として、日中用には notnight を付け、夜間用には night を付けて、リソースを管理。( notnight が付いていない場合、通常の values からリソースを取り出す。)
- res - values-night - values-notnight - values - drawable-night - drawable
3. アプリ内に適用するモードを設定
アプリケーションクラスを継承させたクラスの中で以下の設定を行う。
AppCompatDelegate.setDefaultNightMode([設定するモード])
モード一覧
MODE_NIGHT_YES ... 常に夜間モードを使用。リソースはnight修飾子の付いたものを使用。
MODE_NIGHT_NO ... 夜間モードは使用しない。リソースはnotnight修飾子の付いたものを使用。
MODE_NIGHT_FOLLOW_SYSTEM ... システムの判断に従って判別
MODE_NIGHT_AUTO ... 自動で判別。リソースは日中の場合 notnight修飾子の付いたものを、夜間の場合は night修飾子の付いたものを使用。
モードが切り替わったことをハンドリング
AndroidManifest.xml 内で以下の設定を行う。
<activity android:name=".Activity" android:configChanges="uiMode" />
onConfigurationChanged を用いて、設定されているテーマを確認する。
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val isDarkTheme = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK when (isDarkTheme) { Configuration.UI_MODE_NIGHT_NO -> Log.d("Mode : ", "通常モード") Configuration.UI_MODE_NIGHT_YES -> Log.d("Mode : ", "ダークテーマ") } }
おまけ
ダークテーマに対応しない
styles.xml で、DayNight Theme を継承しない
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
ダークテーマをレイアウトから確認
レイアウトファイルを開き、Design タブに切り替える。
画像のようなアイコンが、左上にあるのでクリック。
Night Mode をNightに設定。( Not Night = 日中、Night = 夜間 )
まとめ
ダークテーマの対応は意外と簡単にできますが、イメージなどのリソースを作る対応が入ると大変だなと感じました。