在 Light 主题上使用 Night 资源

Use Night resources on Light theme

我正在使用 Material Component 的深色主题样式,一切正常,但现在我需要显示具有不同主题的特定视图以获得更多对比度。 我在 values/themes.xml 中定义了我的主题:

<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="colorPrimary">@color/color_primary</item>
    <item name="colorPrimaryVariant">@color/color_primary_variant</item>
    <item name="colorOnPrimary">@color/color_on_primary</item>
    ...
</style>

以及 values/colors.xmlvalues-night/colors.xml 中的两种不同颜色资源。

我想做的是找到一种方法来在使用深色主题时检索浅色主题颜色(反之亦然),或者将相反的主题应用于单个视图。

我找到的唯一解决方案是简单地为两个 colors.xml 文件中的每种颜色定义两个变体(正常和 "reversed"),但是由于定义了很多颜色,我想避免这种情况.

为了避免必须为每种颜色定义多个 light/dark 值变体,我定义了一个自定义样式,它引用相反的主题变体,例如在 values/styles.xml 我定义了:

<style name="ThemeOverlay.AppTheme.Reverse" parent="ThemeOverlay.MaterialComponents.Dark"/>

values-night/styles.xml中:

<style name="ThemeOverlay.AppTheme.Reverse" parent="ThemeOverlay.MaterialComponents.Light"/>

然后在我想使用“反转”主题的布局根目录中:

<LinearLayout android:orientation="horizontal"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:theme="@style/ThemeOverlay.AppTheme.Reverse">

    ...

</LinearLayout>