如何将不同的主题设置给布局(Layout)

36

我已为整个应用程序设置了一个默认主题。它在 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" >

现在这个代码可以正常工作,但是在某个活动中,我需要为一个单独的布局设置不同的主题。像这样:

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

在布局 XML 文件中,我正在尝试为最右侧的子 LinearLayout 设置主题:

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

我希望这个可以正常工作,并且只将暗色主题应用于正确的布局(及其子视图),但它并没有起作用。我已经尝试用内置的@android:style替换@style,但无济于事。我已在布局编辑器和实际设备/模拟器上进行了测试。

是否可能将自定义主题或样式应用于单个布局?


我知道这是一个老问题,你能找到答案吗? - Ilja S.
5个回答

34
现在可以通过在视图上使用 android:theme 属性并将其设置为您喜欢的任何主题来实现。请注意,子视图将继承其父项的主题。

3
截至安卓棉花糖版本 - Mark Renouf
这个被接受的答案非常模糊。我在https://dev59.com/vmMl5IYBdhLWcg3wTljY#55973877提供了一个更详细的答案。 - Abandoned Cart
4
我该如何以编程的方式实现它? - Rawnak Yazdani

12

您可以使用ContextThemeWrapper()在程序化创建布局时应用主题。

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

6

使用支持库,您可以做到以下几点:

app:theme="R.style.MyTheme"

3
API 24新增了每个视图的主题参数,但需要使用Marshmallow或更高版本。
另一种选择是使用Android支持库以实现最大兼容性。
为视图设置支持库的主题参数。
<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>

引用了在资源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>

我能够将你的方法应用到API 16。我还没有尝试过任何低于它的API,但无论如何都不限于API 24。至少像我一样使用androidx。 - Rubén Viguera
@RubénViguera 非常好听到这个消息。在我的答案中,我试图避免使用第三方库,因为它们可能无法与API一起使用。谷歌有一个不错的习惯,就是对“beta”软件包不负责任地放弃支持,而不考虑影响。 - Abandoned Cart

1
将此直接添加到 <head> 可以解决该问题。

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

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

..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接