無趣味な人

生まれてこの方、無趣味。ハマったものこれといって特になし。

Androidアプリ開発:リソースIDを文字列から

テーマの変更を動的にやりたかった。 テーマはPreferenceでListPreferenceを使用して、ユーザーに選択してもらう。 選択したテーマを元に動的に変更する。

配列は以下の感じ。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="theme_array">
        <item>白</item>
        <item>黒</item>
        <item>赤</item>
    </string-array>
    <array name="theme_array_values">
        <item>Theme.Light</item>
        <item>Theme.Dark</item>
        <item>Theme.Red</item>
    </array>
</resources>

Preferenceは以下の感じ。

<ListPreference
    android:defaultValue="Theme.Light"
    android:dialogTitle="テーマ選択"
    android:entries="@array/theme_array"
    android:entryValues="@array/theme_array_values"
    android:key="theme_setting"
    android:summary="ツールバーや背景の色を変更する"
    android:title="テーマの変更"/>

テーマ変更はsetThemeを使えばいいのだが、リソースIDをどう取得すればいいのかわからなかった。 条件分枝しなければならないのかと思ったら簡単な方法があった。 getIdentifierを使えば、文字列からリソースIDを取得できる。

String theme_setting = sharedPreferences.getString("theme_setting", "Theme.Light");”;
Resources res = getResources();
int viewId = res.getIdentifier(theme_setting, "style", getPackageName());
setTheme(viewId);

上記をActivityごとにやる。