web-dev-qa-db-ja.com

別のテーマをレイアウトに設定する方法

アプリ全体にデフォルトのテーマを設定しました。 styles.xmlで次のように定義されています。

    <style name="DefaultTheme" parent="@Android:style/Theme.Holo.Light">
        <!-- Customization here -->
    </style>

ダークテーマも定義しました。

    <style name="DarkTheme" parent="@Android:style/Theme.Holo">
        <!-- Customization here -->
    </style>

マニフェストでは、アプリのメインテーマとしてライトテーマが宣言されています。

    <application
    ...
    Android:theme="@style/DefaultTheme" >

これでうまくいきましたが、アクティビティでは、1つのレイアウトに異なるテーマを設定する必要があります。このようなもの:

    +--------------------------------------------------+
    |         Parent Linear layout (default theme)     |
    |                                                  |
    | +------------------------------------+ +-------+ |
    | |                                    | |       | |
    | |     Left linear layout             | |       | |
    | |     (default theme)                | |       | |
    | |                                    | |       | |
    | |                                    | |       | |
    | |                                    | |    ·<----------- Right Linear Layout
    | |                                    | |       | |        (Need it in dark theme)
    | |                                    | |       | |
    | |                                    | |       | |
    | +------------------------------------+ +-------+ |
    +--------------------------------------------------+

レイアウトxmlファイルで、右端の子LinearLayoutにテーマを設定しようとしています。

    <LinearLayout
    style="@style/DarkTheme">
    ...

私はこれがうまく機能し、暗いテーマを正しいレイアウト(およびその子ビュー)にのみ適用すると期待していますが、機能していません。 @styleを組み込みの@Android:styleに置き換えてみましたが、役に立ちませんでした。これをレイアウトエディターと実際のデバイス/シミュレーターでテストしました。

カスタムテーマまたはスタイルを単一のレイアウトに適用することは可能ですか?

31
Mister Smith

これは、ビューでAndroid:themeプロパティを使用し、好きなテーマに設定することで可能になりました。子ビューは親のテーマを継承することに注意してください。

29

ContextThemeWrapper()を使用して、プログラムでレイアウトを作成するときにテーマを適用できます。

LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));
11
Pongpat

サポートライブラリを使用すると、次のことができます。

app:theme="R.style.MyTheme"
6