macOS Mojave でダークモードが搭載され、他OSでも流行りそうな気配である。
AndroidではAndroid N Developer Preview(初期版)では夜間モードがあったが、実際の製品では搭載が見送られた。だがスマートフォンの場合はバッテリの持ちが長くなるメリットがあるため、将来的に標準搭載されると思う。Twitterのようにアプリレベルで夜間モードを搭載しているものもある。
実はSupport Library の AppCompat 23.2.0 以降、DayNight テーマが導入されており、アプリレベルでの実装が簡単になった。
qiita.com
ということで読書尚友にも夜間モードを実装してみた。
読書画面の背景色はこれまでもカスタマイズできたが、すべての画面のパーツの背景色をダークモードに切り替えられるのがミソである。
実装方法
ActivityのテーマのベースにTheme.AppCompat.DayNightを使用します。
styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.ActionBar">
<item name="windowActionBar">true</item>
<item name="windowNoTitle">false</item>
</style>
</resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="textColorPrimary">#FFFFFF</color>
</resources>
AndroidManifest.xml
<activity android:name="MainActivity"
android:label="@string/app_name" android:theme="@style/AppTheme.ActionBar" >
</activity>
アプリでは、OnCreateの先頭で夜間モードを設定します。
MainActivity.java
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
}
super.onCreate(savedInstanceState);
.....
AppCompatDelegate.MODE_NIGHT_AUTO 自動切替
AppCompatDelegate.MODE_NIGHT_NO 夜間モードオフ
AppCompatDelegate.MODE_NIGHT_YES 夜間モードオン
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM システムに依存
自動切替を実験したところ、22:00に夜間モードに切り替わるようだ。