はじめに
Android 10から本格サポートされたダークテーマ(ダークモード)のアプリ側の対応方法について説明します。
Resource作成
res/values/styles.xml
まず初めに、通常のテーマカスタマイズでも利用するstyles.xmlを更新し、ダークモードON/OFF時に切り替えたいカラーを定義しておきます。
<resources>
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorBackground</item>
<item name="android:textColor">@color/textColor</item>
<item name="android:textColorPrimary">@color/textColorPrimary</item>
<item name="android:textColorSecondary">@color/textColorSecondary</item>
</style>
</resources>
colors.xmlの作成
システム設定でダークモード有効時に参照されるカラー定義をres/values-night/colors.xmlに、通常時のカラーをres/values/colors.xmlにそれぞれ記載しておきます。
例) res/values-night/colors.xml
<resources>
<color name="colorPrimary">#212121</color>
<color name="colorPrimaryDark">#212121</color>
<color name="colorAccent">#80cbc4</color>
<color name="colorTransparent">#00000000</color>
<color name="textColor">#FFFFFF</color>
<color name="textColorPrimary">#FFFFFF</color>
<color name="textColorSecondary">#808080</color>
<color name="colorBackground">#313131</color>
<color name="colorCardBackground">@color/colorPrimary</color>
<color name="colorBackgroundBottomAppBar">#353535</color>
</resources>
ここまで対応すれば、システム設定に連動して、コードは一切書かなくても表示が切り替わります。
アプリ内の設定で動的に切り替えたい場合
アプリ全体に適用するにはAppCompatDelegate.setDefaultNightModeを利用します。
常にダークテーマで表示
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_YES); // 特定のAcitivityのみ適用
常にダークテーマOFF(通常表示)
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_NO); // 特定のAcitivityのみ適用
システム設定に連動する(特に指定しない場合はこちらがデフォルトです)
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_FOLLOW_SYSTEM); // 特定のAcitivityのみ適用