Androidアプリのリソースファイルですがvalues-night
というフォルダに入れる事でダークモード用リソースにする事が可能です。
同じようにvalues-ja
のようなフォルダに入れる事で多言語対応ができます。
あまりないとは思うのですが、海外対応&ダークモード対応を同時にしたい場合にどうすれば良いか調べてみました。
結論としてはvalues-ja-night
といったフォルダに入れる事で日本語のダークモード用のリソースファイルを作る事ができました。
実際にcolors.xmlに色を入れて実験してみます。
まずはvalues/color.xml
に下のような色を定義します。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="test">#FF6666</color> </resources>
その色をMainActivityの背景色に設定します。
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/test" tools:context=".MainActivity"> <!-- 略 --> </androidx.coordinatorlayout.widget.CoordinatorLayout>
この状態でアプリ起動すると先程作成した色が背景色になっています。
次はvalues-ja-night/colors.xml
に下のように色を入れます。
フォルダ名ですがvalues-night-ja
のように逆にするとInvalid resource directory nameというエラーが出ます。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="test">#666666</color> </resources>
シミュレータを日本語&ダークモードにして起動すると新たに設定した色が反映されます。
設定からダークモードOFFにしたり言語を日本語以外にするとvalues/color.xml
が再び反映されるようになります。
values-ja-night/colors.xml
でtestを消した場合もvalues/color.xml
の色が反映されます。
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- <color name="test">#666666</color>--> </resources>
最後にvalues-night
とvalues-ja
の両方がある場合にどうなるかも検証します。
values-ja-night
が一番優先されるので、事前にこのファイルは消しておきます。
values-night
とvalues-ja
はそれぞれ下のように色を設定しました。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="test">#66FF66</color> </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="test">#6666FF</color> </resources>
アプリを起動した所、values-ja
のほうが優先されました。