20
15

More than 3 years have passed since last update.

[Android] ダークテーマの対応方法

Last updated at Posted at 2019-09-29

はじめに

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のみ適用
20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15