34

我为整个应用程序设置了一个默认主题。它在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 无济于事。我已经在布局编辑器和真实设备/模拟器上对此进行了测试。

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

4

5 回答 5

32

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

于 2015-07-17T03:54:11.943 回答
12

您可以ContextThemeWrapper()在以编程方式创建布局时应用主题。

LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));
于 2014-07-04T21:23:21.090 回答
6

使用支持库,您可以:

app:theme="R.style.MyTheme"
于 2016-03-04T07:29:25.850 回答
3

API 24 添加了 per-view 主题参数,但需要 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>
于 2019-05-03T16:30:08.123 回答
0

直接加这个就可以解决问题了。

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

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

..

于 2021-06-03T01:56:56.053 回答