How to set a different theme to a Layout
Solution 1
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.
Solution 2
You can use ContextThemeWrapper()
to apply theme when create layout programmatically.
LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));
Solution 3
With support library you can do:
app:theme="R.style.MyTheme"
Solution 4
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>
Comments
-
Mister Smith almost 3 years
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?