当我多次将额外属性应用于AppTheme时,它将覆盖前一个属性。这是我正在使用的代码:

主要活动:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {

    getTheme().applyStyle(R.style.AppTheme_OverlayPrimaryRed);

    // If you change `false` to `true`, the overlay above is overwritten.
    if (false) {
        getTheme().applyStyle(R.style.AppTheme_OverlayAccentRed);
    }

    super.onCreate(savedInstanceState);

    ...
}


AppTheme.OverlayPrimaryRed:

<style name="AppTheme.OverlayPrimaryRed">
    <item name="colorPrimary">@color/material_red_500</item>
    <item name="colorPrimaryDark">@color/material_red_700</item>
</style>


AppTheme.OverlayAccentRed:

<style name="AppTheme.OverlayAccentRed">
    <item name="colorAccent">@color/material_red_A200</item>
</style>


有什么想法可以解决这个问题吗?

最佳答案

您的样式定义AppTheme.OverlayPrimaryRedAppTheme.OverlayAccentRed隐式继承自AppTheme。由于AppTheme也可能包含colorPrimarycolorPrimaryDark的定义,因此第二个applyStyle语句也将设置这些属性,从而撤消第一个applyStyle调用。

因此,我在this question的答案中的样式覆盖名称中未使用任何点。

如果出于美学原因要保留点,则可以为叠加层定义一个空的父样式,如下所示:

<style name="Overlay">
</style>

<style name="Overlay.PrimaryRed">
    <item name="colorPrimary">@color/material_red_500</item>
    <item name="colorPrimaryDark">@color/material_red_700</item>
</style>

<style name="Overlay.AccentRed">
    <item name="colorAccent">@color/material_red_A200</item>
</style>

关于android - 多次getTheme()。applyStyle(…),而不会覆盖前一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41779821/

10-11 09:32