如何通过样式/主题仅将颜色控制*属性应用于工具栏而不影响其余项目样式

Posted

技术标签:

【中文标题】如何通过样式/主题仅将颜色控制*属性应用于工具栏而不影响其余项目样式【英文标题】:How to apply colorControl* attributes only to the Toolbar via styles/theme without affecting remaing item styles 【发布时间】:2020-07-14 05:40:27 【问题描述】:

我试图在不影响应用程序的其余部分的情况下更改工具栏中按钮的颜色及其波纹,但无论我尝试了多少不同的方式,样式中的某些东西都会“中断”。

到目前为止,通过在我的应用程序的根主题中设置 colorControlNormalcolorControlHighlight,我已经获得了最好的结果(因为它最少破坏了其他样式),但是任何其他设置了 ?colorControlNormal 的图标他们的色调也将继承此更改以及任何 ?selectableItemBackgroundBorderless 和滚动条的颜色。

以前导致更差结果(或根本没有结果)的尝试可通过应用主题定义工具栏样式:

<item name="toolbarStyle">@style/ToolbarStyle</item>

在工具栏样式中定义 colorControl* 属性

<style name="ToolbarStyle" parent="Widget.AppCompat.Toolbar">
    <item name="colorControlNormal">@color/blue</item>
    <item name="colorControlHighlight">@color/blue</item>
</style>

绝对没有任何结果

另一个尝试是直接在工具栏视图中通过主题属性进行的:

<androidx.appcompat.widget.Toolbar
    android:layout_
    android:layout_
    android:theme="@style/ToolbarStyle"/>

得到了我想要的结果,但变化也比我想要的多得多;标题 + 副标题的高度与工具栏的高度相同,因为 android:minHeight 不再被覆盖,但如果我在样式中覆盖该属性,则搜索视图将失去垂直对齐,后退按钮失去其高度等. 我最终无法仅通过主题/样式解决任何其他问题。

所以现在我在文档中没有任何线索可以说明如何仅在工具栏中更改图标颜色和它们各自的波纹颜色而不影响其他任何东西,有没有人知道如何做到这一点而不必诉诸于做以编程方式?

【问题讨论】:

【参考方案1】:

样式的继承不允许这种情况发生。这样做的唯一方法是编程。

【讨论】:

以上是关于如何通过样式/主题仅将颜色控制*属性应用于工具栏而不影响其余项目样式的主要内容,如果未能解决你的问题,请参考以下文章

如何仅将 CSS 样式应用于文本

如何仅将样式应用于父元素?

仅将样式应用于可编辑内容中的选定文本 <p>

如何仅将 css 样式应用于特定的 Vue 组件及其子组件?

仅将 CSS 样式表应用于单个 UserControl

动态jquery。如何仅将 jquery 应用于某些元素?