Android10でダークテーマが使えるようになりましたが、あんまり触ったことがなかったのでやってみました。
一旦DayNight Themeを実装してみよう
DayNight Themeを実装すると、デフォルトではダークモードの変更により画面に変化があるみたいです。
レイアウトにはConstraintLayoutとToolBarだけの状態にしました。
基本 | ダークモード |
---|---|
![]() |
![]() |
まず基本背景色が黒に変わりますね。背景色を指定していないレイアウトには影響がありそうです。
スクショには見えないですが、テキストのデフォルトカラーも変更されます。
その以外、Material Componentではダークテーマ用のデフォルトカラーが用意されているらしいです。
そしてToolBarの色ですが、これはリソースで色を指定しています。
ダークモードになるとvalues-night配下のリソースが使われるようになります。
<color name="colorPrimary">#6200EE</color>
<color name="toolBarColor">@color/colorPrimary</color>
<color name="colorPrimary">#BB86FC</color>
ToolBarの背景色はcolorPrimary
のリソースを使うようにしています。
そのcolorPrimary
がnightリソースで上書きされたため、色が変更になりましたね。
この状態でtoolBarColor
をnightリソースで定義してみました。
<color name="colorContents">#212121</color>
<color name="toolBarColor">@color/colorContents</color>
結果 |
---|
![]() |
ToolBarの色が変わりました。
LifeCycleはどうなる?
クイック設定でダークモードのON、OFFをする時、アプリのテーマが切り替わるのですが、その時LifeCycleはどうなるでしょうか。
今はActivityだけあるのでそのままログを書き出してみました。
結果 |
---|
![]() |
Destroyまでしちゃいますね。
ではBottomNavigationを入れてFragmentを3つほど入れて試してみます。
結果 |
---|
![]() |
やっぱりDetachまで行きます。
SaveInstanceStateを利用してデータを復旧する必要がありそうです。
別にDayNight Themeではなくてもシステムのダークテーマ設定はリソースを変更する
DayNight Themeはvalue-nightを指定していない時、デフォルトのダークモード用のカラーが用意されているテーマで、Android10のシステムに追加されてダークテーマはvalue-nightにリソースがあればそれを使うようになっています。
以下は背景はvalue-nightにカラーを指定していて、RadioButtonのスタイルには指定していない時にダークテーマに切り替えた結果です。
AppCompat.Light.NoActionBar | AppCompat.DayNight.NoActionBar |
---|---|
![]() |
![]() |
アプリの中でLight/Dark Themeに切り替える
システムの設定に寄せなくて、アプリでテーマができるようです。この場合システムの設定は無視されます。
// システムに寄せる
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM)
// ライトテーマ
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
// ダークテーマ
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES)
システムはダークテーマにして、アプリはライトテーマにする |
---|
![]() |
このコードでの変更はAndroid10ではなくてもテーマが切り替えられます。(api24で試してみました)
そしてこの切り替えの時にも画面は再作成されます。
まとめ
- DayNight Themeはダークテーマ上のデフォルトカラーを用意しているスタイル
- Android 10に追加された明示的ダークテーマはONの時value-night配下のリソースを使う
- アプリの中でテーマを切り替えられる(Android10ではなくてもいい)
- アプリが起動中でのテーマの切り替えは画面を再作成させる