しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Androidアプリ開発でダークモード対応とローカライズを両立する方法を調べてみた

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-nightvalues-jaの両方がある場合にどうなるかも検証します。
values-ja-nightが一番優先されるので、事前にこのファイルは消しておきます。
values-nightvalues-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のほうが優先されました。