34
votes

I've set a default theme for the whole app. It's defined in styles.xml as follows:

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

I've also defined a dark theme:

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

In the manifest it is declared the light theme as the main theme for the app:

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

Now this is working fine, but in an activity, I need to set a different theme for a single Layout. Something like this:

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

In the layout xml file I'm trying to set a theme for the rightmost child LinearLayout:

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

I'd expect this to work just fine, and to apply the dark theme to the right layout only (and its child views), but it is not working. I've tried replacing the @style with a built-in @android:style to no avail. I've tested this in the layout editor and on real device/simulator.

Is it possible to apply a custom theme or style to a single layout?

5
I know it is old question, were you able to find an answer to it?Ilja S.

5 Answers

32
votes

This is now possible by using the android:theme property on the view and setting it to any theme you like. Note that the child views will inherit the theme of their parent.

12
votes

You can use ContextThemeWrapper() to apply theme when create layout programmatically.

LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));
6
votes

With support library you can do:

app:theme="R.style.MyTheme"
3
votes

API 24 adds a per-view theme parameter, but requires Marshmallow or higher.
The alternative is to use the android support library for maximum compatibility.

Set the support library's theme parameter for the view

<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>

which references a theme defined as a style inside a resource xml

<resources>
    <style name="MyTheme">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
0
votes

adding this directly to the can solve the problem.

<com.google.android.material.slider.Slider android:stepSize="1"

      //  app:trackColorActive="#ff4500"
      //  app:trackColorInactive="#fbb999"
    
        android:theme="@style/Theme.MaterialComponents.DayNight"

..