web-dev-qa-db-fra.com

Comment définir un thème différent sur une mise en page

J'ai défini un thème par défaut pour l'ensemble de l'application. Il est défini dans styles.xml comme suit:

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

J'ai également défini un thème sombre:

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

Dans le manifeste, le thème de la lumière est déclaré comme thème principal de l'application:

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

Maintenant, cela fonctionne bien, mais dans une activité, je dois définir un thème différent pour une seule mise en page. Quelque chose comme ça:

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

Dans le fichier xml de mise en page, j'essaie de définir un thème pour l'enfant LinearLayout le plus à droite:

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

Je m'attendrais à ce que cela fonctionne très bien et à appliquer le thème sombre uniquement à la bonne mise en page (et à ses vues enfant), mais cela ne fonctionne pas. J'ai essayé de remplacer le @style par un style @Android: intégré en vain. J'ai testé cela dans l'éditeur de mise en page et sur un appareil/simulateur réel.

Est-il possible d'appliquer un thème ou un style personnalisé à une seule mise en page?

31
Mister Smith

Ceci est désormais possible en utilisant le Android:theme propriété sur la vue et définissez-la sur le thème de votre choix. Notez que les vues enfant hériteront du thème de leur parent.

29
Miro Markaravanes

Vous pouvez utiliser ContextThemeWrapper() pour appliquer le thème lors de la création de la mise en page par programmation.

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

Avec la bibliothèque de support, vous pouvez faire:

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

L'API 24 ajoute un paramètre de thème par vue, mais nécessite Marshmallow ou supérieur.
L'alternative est d'utiliser la bibliothèque de support Android pour une compatibilité maximale.

Définissez le paramètre de thème de la bibliothèque de support pour la vue

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    ...
>
    <LinearLayout
        app:theme="R.style.MyTheme"
        ...
    >
        <!-- content-->
    </LinearLayout>
...
</LinearLayout>

qui fait référence à un thème défini comme un style à l'intérieur d'un xml de ressource

<resources>
    <style name="MyTheme">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
2
Abandoned Cart